JDK8的三个新特性(Lambda表达式,Stream流,Optional类)

JDK8的三个新特性(Lambda表达式,Stream流,Optional类),第1张

JDK8的三个新特性(Lambda表达式,Stream流,Optional类) Lambda表达式

在使用Lambda表达式之前必须了解函数式接口,因为它式在此基础上使用的

public class Lambda02 {
    public static void main(String[] args) {
        Consumer con = (a) -> System.out.println(a);
        con.accept("hello");

        Supplier sub = () -> {
            int a = 0;
            for (int i = 0; i < 10; i++) {
              a += i;
            }
            return a;
        };
        System.out.println(sub.get());


        Function fun = (a) -> {
            return a;
        };
        System.out.println(fun.apply(100));


        Predicate pre = (a) -> a<100;
        System.out.println(pre.test(99));
        List strList = Arrays.asList("北京","南京","普京","上海");
        List stringList = filterStr(strList, a -> a.contains("京"));
        System.out.println(stringList);

    }
    //函数作为一个对象传进去 --- Predicate pre 函数对象
    public  static List filterStr(List list, Predicate pre){
        List filterList = new ArrayList<>();
        for (String str: list) {
            if(pre.test(str)){
                filterList.add(str);
            }
        }
        return filterList;
    }
}

编写规则

public class Lambda01 {
    public static void main(String[] args) {


        
        GreetingService greetingService = new GreetingService(){
            @Override
            public void sayMessage(String message) {
                System.out.println(message);
            }
        };
        greetingService.sayMessage("之前写法");

      
        GreetingService greetingService1 = message -> System.out.println(message);
        greetingService1.sayMessage("Lambda写法");

        //1.无参,无返回值
        Runnable runnable = () -> {
            System.out.println("1.无参,无返回值");
        };
        runnable.run();
        //2.一个参数,无返回值
        Consumer con = (String a) -> {
            System.out.println(a);
        };
        con.accept("2.一个参数,无返回值");
        //3.数据类型省略-类型推断
        Consumer con1 = (a) -> {
            System.out.println(a);
        };
        con.accept("3.数据类型省略-类型推断");
        //4.一个参数时,小括号可以省略
        Consumer con2 = a -> {
            System.out.println(a);
        };
        con.accept("4.一个参数时,小括号可以省略");
        //5.两个或以上的参数,多条语句,有返回值
        Comparator com = (o1,o2) ->{
            System.out.println(o1);
            System.out.println(o2);
            System.out.println("5.两个或以上的参数,多条语句,有返回值");
            return o1.compareTo(o2);
        };
        //6.若只有一条执行语句,return 和 大括号都可以省略
        Comparator com2 = (o1,o2) -> o1.compareTo(o2);
        int compare = com2.compare(1, 2);
        System.out.println("若只有一条执行语句,return 和 大括号都可以省略");
    }

   
    interface GreetingService {
        void sayMessage(String message);
    }

方法引用

public class MethodRef {
    public static void main(String[] args) {
        //对象::实例方法
        Consumer con = str -> System.out.println(str);
        con.accept("bbb");
//        PrintStream out = System.out;
        Consumer con1 =  System.out::println;
        con1.accept("aaaa");

        //类::静态方法
        Comparator com = (t1,t2) -> Integer.compare(t1,t2);
        System.out.println(com.compare(12, 3));

        Comparator com2 = Integer::compare;
        System.out.println(com2.compare(3,12));

        //类::实例方法
        Comparator cor = (t1,t2) -> t1.compareTo(t2);
        System.out.println(cor.compare("a", "b"));

        Comparator cor2 = String::compareTo;
        System.out.println(cor2.compare("b", "a"));


        //数组引用(参考)
        Function fun = length -> new String[length];
        String[] apply = fun.apply(5);
        System.out.println(Arrays.toString(apply));

        Function fun2 = String[]::new;
        String[] apply1 = fun.apply(5);
        System.out.println(Arrays.toString(apply1));
    }
Stream流

创建方式

public class Stream01 {
    public static void main(String[] args) {
        
        ArrayList list = new ArrayList<>();
        Stream stream = list.stream();
        Stream parallelStream = list.parallelStream();


        
        int[] arr = new int[]{1,2,3};
        IntStream stream1 = Arrays.stream(arr);
        String[] strings = new String[]{"a","b","c"};
        Stream stream2 = Arrays.stream(strings);

        
        Stream a = Stream.of("a", "b", "c");
        Stream b = Stream.of(1, 2, 3, 4);

        
        Stream.iterate(0,t -> t+2).limit(10).forEach(System.out::println);
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
    }
}
 

中间 *** 作

public class Stream02 {
    public static void main(String[] args) {
        
        ArrayList list = new ArrayList<>(){};
        list.add("abc");
        list.add("acd");
        list.add("bbc");
        list.add("bba");
        // filter(Predicate predicate) --接收Lambda,从流中过滤某些元素
        list.stream().filter(e -> e.contains("a")).forEach(System.out::println);

        //limit(n) --阶段流,使其元素不超过给定数量
        list.stream().limit(2).forEach(System.out::println);
        //skip(n) --跳过元素,返回一个扔掉前n个元素的流,若流中元素不足n个,则返回空流
        list.stream().skip(2).forEach(System.out::println);
        //distinct() --筛选,通过流所生成元素的hashcode()和equals()去除重复元素
        list.stream().distinct().forEach(System.out::println);

        
        List integers = Arrays.asList(1, 2, 3);
        //map(Function f) --接收一个函数作为参数,将元素转化为其他形式或者提取信息,该函数会被应用到每个元素
        integers.stream().map(e -> e*e).forEach(System.out::println);
        //flatMap(Function f) --接收一个函数作为参数,并将流中的每个值都换成另一个流,然后把所有的流连接成一个流
        List stringList = Arrays.asList("aa", "bb", "cc");
        //如果用map()
        Stream> streamStream = stringList.stream().map(Stream02::fromStingToStream);
        //如果用flatMap(),可以看到返回的类型不同,如果遍历返回值使用flatMap只需要一层遍历,它自动将里面的集合打开.
        Stream characterStream = stringList.stream().flatMap(Stream02::fromStingToStream);


        
        //sorted() --自然排序,需要实现Comparable接口
        //sorted(Comparator com) --定制排序,传入一个函数对象自定义排序规则
    }
    //将字符串中的多个字符构成的集合转换为对应的Stream实例
    public static Stream fromStingToStream(String str){
        ArrayList list = new ArrayList<>();
        for (Character c: str.toCharArray()) {
            list.add(c);
        }
        return list.stream();
    }
}

终止 *** 作

public class Stream03 {

    public static void main(String[] args) {
        
        List stringList = Arrays.asList("abc", "cba", "aabb");
        //allMatch(Predicate p) --检查是否匹配所有元素(都符合规则)
        boolean b = stringList.stream().allMatch(e -> e.contains("a"));//都包含"a"为 true
        //anyMatch(Predicate p) --检查是否至少匹配一个元素(有一个即可)
        boolean b1 = stringList.stream().anyMatch(e -> e.contains("c"));//有一个包含"c"为 true
        //noneMatch(Predicate p) --检查是否没有匹配的元素
        boolean b2 = stringList.stream().noneMatch(e -> e.startsWith("c"));//没有以"d"开头才为 true
        //findFirst --返回第一个元素
        //findAny --返回当前流的任意元素
        //count --返回当前流的元素总个数
        //max(Comparator c) --返回流中最大值
        //min(Comparator c) --返回流中最小值
        Optional min = stringList.stream().min(String::compareTo);
        System.out.println(min);
        //forEach(Consumer c) --内部迭代

        
        //T reduce(T identity, BinaryOperator accumulator) --可以将流中的元素反复结合起来,得到一个值,返回 T identity是一个初始值.
        List integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer reduce = integers.stream().reduce(0, Integer::sum);
        System.out.println(reduce);
        //Optional01 reduce(BinaryOperator accumulator) --可以将流中的元素反复结合起来,得到一个值,返回Optional


        
        //collect(Collector c) --将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中的元素做汇总方法
        Set collect = integers.stream().filter(e -> e < 5).collect(Collectors.toSet());
    }

}

总结:

  • 1.Stream关注的是对数据的计算,与CPU打交道,
  • 集合关注的是数据的存储,与内存打交道
  • 2.Stream自己不会存储数据
  • Stream不改变原对象,相反,它会返回一个持有结果的新的Stream
  • Stream是延迟 *** 作的,需要结果的时候才会执行
  • 3.Stream的执行流程:Stream实例化 -> 一系列的中间 *** 作(过滤、映射等) -> 终止 *** 作
  • 4.说明:
  • Stream一个中间 *** 作链对数据源数据进行处理
  • 一旦执行终止 *** 作,就执行中间 *** 作链,并产生结果,之后便不再被使用.
Optional类
public class Optional01 {
    
    public static void main(String[] args) {
        Boy boy = new Boy();
        Boy boy1 = null;
        Optional b = Optional.of(boy);
        Optional b1 = Optional.empty();
        Optional b3 = Optional.ofNullable(boy1);
    }

    
    public static String  getName(Boy boy){
        Optional boy1 = Optional.ofNullable(boy);
        Boy boy2 = boy1.orElse(new Boy("男神"));
        return boy2.getName();
    }

}
 

注: 以上内容装13必备.

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/4670494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)