假设以下是数据类的示例:
class Country {
List<Region> regions = new ArrayList<>();
List<Region> getRegions() {
return regions;
}
}
class Region {
String getName() {
return "some name";
}
}
假设我有一个国家列表
List<Country> countries = new ArrayList<>();
我想将它们流式传输到它们所在的区域和相应的名称,我想要做以下操作:
countries.stream().flatMap(Country::getRegions).map(Region::getName)...
然而,该代码无法编译,因为 "getRegions" 的返回值是一个集合(列表),而不是流,而 flatMap 方法接受的是流。但是,由于我知道任何集合都可以通过其 Collection.stream() 方法转换成流,所以这不应该是个问题。尽管如此,我还是被迫按照以下方式编写它:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
如果考虑到更丰富的上下文,这种写法比前者不易阅读。
问题是我是否忽略了任何原因导致这样冗长?我们的框架中有很多例子都强制我采用这种写法,总是让我感到不满意。也许我只需要在项目中添加Kotlin,并扩展Stream类与一个接收Collection参数的flatMap方法 :p
flatMap
应该接受一个集合,但我不确定 SO 能否提供一个明确的解释,除了“编写它的人没有以那种方式编写它”。 - khelwoodStream<Country>
,或者添加一个名为regions
的方法来实现。 - Jorn Vernee.map(Country::getRegions).flatMap(List::stream)
,但我不明白为什么方法引用被认为比简单的lambda表达式更优越... - Holger