考虑一个列表
和方法可选的
。我想将thing
s映射到optional
s并获得第一个other
。显而易见的解决方案是使用Things.stream().FlatMap(This::Resolve).FindFirst()
,但FlatMap
要求返回一个流,而Optional
没有stream()
方法(或者它是集合
或提供一个方法将其转换为集合
,或将其作为集合
)查看。
我能想出的最好的办法是:
things.stream()
.map(this::resolve)
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst();
但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?
optional.stream
已添加到JDK9中。这使您能够执行以下操作,而不需要任何helper方法:
Optional<Other> result =
things.stream()
.map(this::resolve)
.flatMap(Optional::stream)
.findFirst();
是的,这是API中的一个小漏洞,因为将可选
转换为零或一个长度的流
有点不方便。您可以这样做:
Optional<Other> result =
things.stream()
.map(this::resolve)
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.findFirst();
不过,在flatmap
中使用三元运算符有点麻烦,因此编写一个小的helper函数可能更好:
/**
* Turns an Optional<T> into a Stream<T> of length zero or one depending upon
* whether a value is present.
*/
static <T> Stream<T> streamopt(Optional<T> opt) {
if (opt.isPresent())
return Stream.of(opt.get());
else
return Stream.empty();
}
Optional<Other> result =
things.stream()
.flatMap(t -> streamopt(resolve(t)))
.findFirst();
本文向大家介绍java8中Stream的使用示例教程,包括了java8中Stream的使用示例教程的使用技巧和注意事项,需要的朋友参考一下 前言 Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。 本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1. 原理 S
概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 特点 不是数据结构,不会保存数据。 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行
在我的一些项目中,我经常使用do-thin-check NextForNull-getNext循环模式(不知道它是否有官方名称)。但是在Java8中,与检查客户端代码中的空引用相比,使用可选被认为是更干净的代码。但是当在这种循环模式中使用可选时,代码会变得有点冗长和丑陋,但是因为可选有一些方便的方法,我希望一定存在比我下面提出的更干净的方法。 示例: 考虑到下面的课程。 其中第一个项目的nr==1
本文向大家介绍java8使用Stream API方法总结,包括了java8使用Stream API方法总结的使用技巧和注意事项,需要的朋友参考一下 Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。 Stream 的三个操作步骤 1、创建S
编译错误->[无法推断flatMap(函数>)的类型参数]