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();