java8 Lambda表达式详解

来源:互联网 发布:数据库与区块链对比 编辑:程序博客网 时间:2024/05/16 10:59





对象:Stream  集合可用用生成一个流。
特性:保持有序性。可以对数据进行排序、筛选、截断等操作。 
注意:流的使用只能一次性消费。
例如: List<String> title = Arrays.asList("Java8", "In", "Action");
Stream<String> s = title.stream();
s.forEach(System.out::println);
s.forEach(s -> s.); // 此处将抛出异常
流的中间操作:
方法:filter 用于接收一个Lambda 参数
例如:(a -> a%2 == 0) 或者 Class.method
注意:filter参数只能接收一个Boolean参数

方法:map 用于筛选流中数据但和filter不同map也是接收一个Lambda参数但是参数返回可以是任意类型数据
例如:(a -> a.getMethod) 或者 Class.method
注意:map需要一个Lambda参数。值得注意的是,map中返回的参数类型决定了整个流的结束时返回的数据类型。如果有多个map返回值都不一致,则取最后一个map的值作为最终的map返回值。

方法:limit方法用于截断流,也称短路。接收一个long类型的数据。
例如:s.limit(n) 
注意:设置limit方法后,流只会检查小于limit设置参数的那一部分,从那一部分提取数据,如果无数据返回空流。

方法:skip(n) 方法用于跳过流中n个元素,从第n个元素开始。
例如:s.skip(2) 流将从第二个元素开始执行
注意:设置limit方法后,流只会检查大于skip设置参数的那一部分,从那一部分提取数据,如果无数据返回空流。

方法: flatmap个人理解就是将流计算数据合并。参数Lambda表达式。
例如:List<Integer> numbers1 = Arrays.asList(1, 2, 3);
 List<Integer> numbers2 = Arrays.asList(3, 4);
 numbers1.stream().flatMap(i -> numbers2.stream().map(j -> new int[]{i * j})).collect(toList()); 
注意: 在flatmap 中可以加入无限制的流中间操作例如在 flatmap中再次加入过滤条件是否能被3整除:
numbers1.stream().flatMap(i -> numbers2.stream().filter(j -> (i + j) % 3 == 0).map(j -> new int[]{i * j})).collect(toList()); 




方法:sorted方法用于给数据排序。接收参数为:comparing(Dish::getCalories)
例如:sorted(comparing(Dish::getCalories).reversed()) 倒叙 去掉.reversed() 为正序
注意:默认正序 

方法:distinct 用于去除流中重复数据。无参数
例如:distinct()
        注意:无

流的终端操作:
方法: forEach 循环数据。接收一个Lambda参数,这一操作返回void
        例如: forEach(System.out::println) 或者 forEach(i -> i.equals("red"))
        注意: 使用此方法会中断流,并且流开始计算之前在流中加入的各种操作。

方法: count 用于统计使用。返回流中元素的个数。这一操作返回long
例如: count() 
注意: 此操作也会中断流操作。

方法: collect 用于把流归纳成集合。比如List、Map 甚至是Integer
例如: collect(toList()) 或者 collect(toSet())
注意: 此操作也会中断流操作。


方法: anyMatch 审查流中的数据是否包含于某个值,返回值为Boolean,参数为Lambda表达式。
例如: s.anyMatch(n ->"Java8".equals(n))
注意: 此方法只能接收Lambda 表达式返回结果为 Boolean类型,并且该方法有返回值因此为一个终端操作。


方法: allMatch 审查流中的所有数据是否包含于某个值,返回值为Boolean,参数为Lambda表达式。
例如: s.allMatch(n ->"Java8".equals(n))
注意: 此方法只能接收Lambda 表达式返回结果为 Boolean类型,并且该方法有返回值因此为一个终端操作。

方法: noneMatch 审查流中的所有数据是不否包含于某个值,返回值为Boolean,参数为Lambda表达式。
例如: s.noneMatch(n ->"Java8".equals(n))
注意: 此方法只能接收Lambda 表达式返回结果为 Boolean类型,并且该方法有返回值因此为一个终端操作。

方法: findAny  返回查找到的流中任意元素,参数无,一般配合filter使用。
例如: filter(a -> a%2 == 0).findAny(); 流结束。
注意: 如果无结果,返回空流,如果多个返回查找到的第一个。如果存在返回 Optional 对象(后面有说明)


方法: reduce  把一个流中的元素组合起来进行计算。返回计算结果,参数为lambda表达式。
例如: reduce(0, Integer::max); 
注意:  只能接收数字组成的流进行计算。否则抛出异常

注: 所有终端操作不可作用在同一个流上。 中间操作可以无限制使用。Lambda表达式为一部分,如果有不正确的欢迎指正。

完整例子:
List<Dish>  list= Dish.menu;
System.out.println(list.stream().filter(dish -> dish.getCalories() < 400).sorted(comparing(Dish::getCalories)).map(dish -> dish.getCalories()).limit(1).collect(toList()));

 






1 0