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实用类中提供了很多静态方法,可以方便的创建常用的收集器实例。