JAVA8 Collectors的lambda表达式

https://github.com/singgel?tab=repositories

lambda表达式我最先接触是在C#里面,当时使用linq的时候,内心就在想为什么java没有呢,当时还搜索了java lambda的关键字

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

流的操作其实可以分为两类:处理操作、聚合操作

  • 处理操作(中间操作):诸如filter、map等处理操作将Stream一层一层的进行抽离,返回一个流给下一层使用。
- 有状态 sorted(),必须等上一步操作完拿到全部元素后才可操作
- 无状态 filter(),该操作的元素不受上一步操作的影响 
  • 聚合操作(终端操作):从最后一次流中生成一个结果给调用方,foreach只做处理不做返回。
- 短路操作findFirst(),找到一个则返回,也就是break当前的循环
- 非短路操作forEach(),遍历全部元素 

Stream的所有操作:

无状态中间操作是指元素的处理不受前面元素的影响

有状态的中间操作必须等到所有元素处理之后才知道最终结果

短路操作是指不用处理全部元素就可以返回结果

Stream操作分类
中间操作(Intermediate operations)
无状态(Stateless) unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek()
有状态(Stateful) distinct() sorted() limit() skip()
结束操作(Terminal operations)
非短路操作 forEach() forEachOrdered() toArray() reduce() collect() max() min() count()
短路操作(short-circuiting) anyMatch() allMatch() noneMatch() findFirst() findAny()

Stream流操作高级API实例

规约reduce()

reduce操作可以实现从一组元素中生成一个值,sum()、max()、min()、count()等都是reduce操作,将他们单独设为函数只是因为常用。

reduce()最常用的场景就是从一堆值中生成一个值。

int sum = widgets.stream()
                      .filter(b -> b.getColor() == RED)
                      .mapToInt(b -> b.getWeight())
                      .sum();

 https://docs.oracle.com/javase/8/docs/api/

猜你喜欢

转载自blog.csdn.net/singgel/article/details/81075332
今日推荐