>> completableFutureList = upsTags
.stream().map(tag -> CompletableFuture.supplyAsync(() -> getLeafTagValueByTag(tag)
, JavaThreadPoolConfig.META_QUERY_EXECUTOR)).collect(toList());
return
completableFutureList.stream().map(CompletableFuture::join).filter(Optional::isPresent)
.map(Optional::get).filter(Objects::nonNull).collect(toList());
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();
docs.oracle.com/javase/8/do…
- 796
-
QuanLiu
WebSocket
Spring
- 1027
-
阿拉斯加大闸蟹
爱炒股的RD @ xueqiu.com