单独使用flatMap()是否比map().flatMap()更好?

3
我将为您翻译中文,以下是需要翻译的内容:

我想知道flatmapping的两种情况之间是否有明显的区别。

情况1:

someCollection
    .stream()
    .map(CollectionElement::getAnotherCollection)
    .flatMap(Collection::stream);

案例2:

someCollection
    .stream()
    .flatMap(element -> element.getAnotherCollection().stream());

哪个更好?在性能方面哪一个更优秀?


我认为这只是两种方式,第二种是语法糖!为了做到与第一种相同的事情! - Raman Mishra
他们正在做完全相同的事情。 - Sam Orozco
1个回答

5

哪个应该被优先选择?

这两种方式的差别非常微小,取决于你和你的团队 - 选择你感觉更舒适的那个。我会选择第二个选项,因为它更加简洁。

在性能方面,哪一个更好?

从时间复杂度的角度来看,两者都没有明显的优劣之分。第一个示例涉及创建一些不必要的对象,因此第二个示例是更合理的选择。 但是,请记住我们在这里谈论的是微观优化。


我想补充一下,外观上的差异可能会影响可编辑性。例如,在第一个示例中,在调用mapflatMap之间添加filter或另一个map可能会更容易。这也可能是一个缺点,但这将是codereview.stackexchange.com的讨论主题。而“简洁性”也是一个主观问题;-) - Druckles
第一个例子中创建了哪些对象?我不太了解Java的流实现,但它不会将它们优化掉吗? - Druckles
@Druckles 所说都是对的,但请记住,上述任务严格来说只涉及流结构的展平 - 如果您需要在其中添加过滤器/映射,则可以在单个flatMap调用之后添加它。关于第二个示例中的额外成本,在单个map()调用中甚至会发生很多事情,以添加另一个操作到ReferencePipeline。因此,不仅会创建另一个Stream对象,还会创建另一个函数接口表示形式+由map()调用触发的代码。它将被JVM优化,但归根结底,有人需要收集垃圾。 - Grzegorz Piwowarek

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