Java学习笔记---JDK8新特性(Lambda表达式)

1. Lambda表达式基础

  • 格式:
() -> {};
  // () 为lambda表达式的参数
  // -> 为箭头操作符
  // {} 为lambda方法体

  lambda表达式结果为一个实例对象,用于直接实例化接口。

  • 使用举例:
Comparator<Integer> comparator = (num1, num2) -> {return Integer.compare(num1, num2)};
  • 注意事项:
    1. 当输入参数只有一个时,可以省略括号; 其余情况(0个或是多个)都需要有括号。
    
    例:
      
    Consumer<Integer> consumer = (param) -> {System.out.println(param);};
    优化:Consumer<Integer> consumer = param -> {System.out.println(param);};
    2. 当方法体中只有一条语句时,大括号可以省略,若一条语句是return,则return也可以省略。 例:
      
    Comparator<Integer> comparator = (num1, num2) -> {return Integer.compare(num1, num2);};
    优化:Comparator<Integer> comparator = (num1, num2) -> Integer.compare(num1, num2);
  • 特殊情况:
若在lambda体中的操作,已经有实现的方法了,就可以使用方法引用。

例:
    Comparator<Integer> comparator = (num1, num2) -> Integer.compare(num1, num2);

    优化:Comparator<Integer> comparator = Integer :: compare;
  • 常用的函数接口
    消费型接口 :Consumer<T> 抽象方法为:void accept(T t);
                    
    
    生产型接口 :Supplier<T> 抽象方法为:T get();
    
    
    函数型接口:Function<T, R> 抽象方法为:R apply(T t);
    
    
    断定型接口:Predicate<T> 抽象方法为:boolean test(T t);
    

2. Stream API

  • 如何创建Stream实例对象。
    方法一(通过集合):
        JDK8中Collection接口被拓展,提供了两个获取流的方法:
            stream(): 获取一个顺序流
            parallelStream(): 获取一个并行流
    例:
        Stream<Integer> stream = list.stream();
        Stream<Integer> integerStream = list.parallelStream();
    
    方法二(通过数组):
        JDK8中Arrays中的静态方法stream()可以获取数组流
    例:
        IntStream intStream = Arrays.stream(new int[]{1, 2, 3, 4, 5});
    
    方法三:
        调用Stream类的of()创建一个流
    例:
        Stream<Integer> integerStream = Stream.of(1, 2, 4, 5, 6);
    
    方法四(无限流):
        调用Stream类的静态方法iterate() 或 generate()
  • Stream的常用中间操作
    1. 筛选与切片
        filter(Predicate p) 接受一个断定型函数,按照此函数过滤流中的数据。
        distinct() 去重,通过hashcode() 和 equals() 去除重复元素。
        limit(long maxSize) 截断流,使其元素不超过maxSize。
        skip(long n) 跳过元素,返回一个去除前N个元素的流,若元素不足N个,则返回一个空流。
    
    2. 映射
        map(Function f) 接受一个函数,按照此函数将流中每个元素映射成一个新元素。
        flatMap(Function f) 接受一个函数,将流中的每个值都换成另一个流,最后结合成一个流返回。
    
    3. 排序
        sorted() 按照自然排序生成一个新流。
        sorted(Comparator c) 按照所给比较器对象,排序生成一个新流。
  • Stream的常用终止操作(流进行了终止操作后,不可再次使用)
    1. 匹配与查找
        allMatch(Predicate p) 检测所有元素是否符合,最终返回true或者false。
        anyMatch(Predicate p) 检测是否至少有一个元素符合,最终返回true或者false。
        noneMatch(Predicate p) 检测是否所有元素都不符合,最终返回true或者false。
        findFirst() 返回第一个元素。
        findAny() 返回任意一个元素。
    
    2. 归约
        reduce(T iden, BinaryOperator b) 将流中所有元素按传入的BinaryOperator反复结合起来,最后在结合iden初始值,返回T。
        reduce(BinaryOperator b) 将流中所有元素按传入的BinaryOperator反复结合起来,返回Optional<T>3. 收集
        collect(Collector c) 将最终的结果从流转换为其他形式的容器,Collector实用类中提供了很多静态方法,可以方便的创建常用的收集器实例。
posted @ 2022-09-20 22:18  __three  阅读(35)  评论(0)    收藏  举报