为什么没有Stream.flatMap()函数?

10
为什么没有无参的 Stream.flatMap() 方法来展平 Stream<Stream<T>>
可以简单地使用 Stream.flatMap(o -> o) 实现。
在我看来,这是迄今为止最常见的使用 flatMap(Function mapper) 的方法。

3
我不认为这种情况很普遍,浏览了一些搜索结果(链接)后,我还没有看到它。但是flatmap(o -> o.stream())已经出现了。 - user2357112
2
你怎么获取它呢?我很难想象除了作为“map”的结果之外,它会在哪里出现,如果是这种情况,你可以使用flatMap代替。 - Louis Wasserman
3
жҲ‘е·Із»Ҹйқһеёёйў‘з№Ғең°дҪҝз”ЁStream APIгҖӮжҲ‘и®ӨдёәжҲ‘еңЁз”ҹдә§д»Јз ҒдёӯдҪҝз”ЁдәҶflatMapи¶…иҝҮ100ж¬ЎгҖӮжңҖеёёи§Ғзҡ„з”Ёжі•жҳҜflatMap(Arrays::stream)жҲ–иҖ…flatMap(Collection::stream)гҖӮжҲ‘еҫҲе°‘йңҖиҰҒе…¶дёӯзҡ„identityеҸӮж•°гҖӮ - Tagir Valeev
6
很遗憾,这个问题已经关闭了,否则我可以回答它。所有Stream方法都适用于任何类型的流元素。唯一值得注意的例外是sorted(),它假设元素实现了Comparable接口。但是添加更多这样的方法会使API变得混乱,容易出错。在提出的flatMap()方法中,您必须假设流元素本身也是流,因此您需要在内部进行未检查的转换。如果有人误用它,他在编译时不会有错误,但在运行时会出现ClassCastException。您会在Stack Overflow上看到很多类似“flatMap不起作用,求助”的问题。 - Tagir Valeev
2
@StuartMarks,我想在我的库中添加像flatCollection()(=flatMap(Collection::stream))或flatArray()(=flatMap(Arrays::stream))这样的快捷方式,但是发现没有办法在编译时检查当前流元素类型是数组还是集合。因此,这些方法只会在错误使用时增加混乱和运行时错误。所以我放弃了这个想法。sorted()也有同样的问题:它不会在编译时检查流元素是否可比较(不像sorted(Comparator.naturalOrder()))。但是sorted是可以原谅的,因为它非常有用。 - Tagir Valeev
显示剩余3条评论
1个回答

13

我认为这是因为它很容易使用

import static java.util.function.Function.identity;
...  
streamOfStreams.flatMap(identity())

1
我认为 o->o 更容易。但是像我建议的那样,根本不需要参数会更容易。 - principal-ideal-domain
主理想域:可能是因为您正在添加一个函数,它实际上并没有“增加功能”或“变得更有效”,因为它在幕后执行Function.identity(),但会增加函数计数和更多需要记录的内容。 - WORMSS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接