让我们假设开发中的一种非常正常的行为:我有一个 Collection 并且需要将此 Collection 映射到另一个对象。一个平面地图场景。例子:我们有一些方法必须返回一组源对象:public Set<Source> getSources(String searchText);让我们找出一种实现方式:public Set<Source> getSources(String searchText) { HashSet<Source> sources = new HashSet<>(); Set<String> urls = this.crawlerService.getUrls(searchText); urls.forEach(url -> sources.add(Source.builder().url(url).build())); return sources;}Java Stream 的另一种实现:public Set<Source> getSources(String searchText) { Set<String> urls = this.crawlerService.getUrls(searchText); return urls.stream() .flatMap(e -> Stream.of(Source.builder().url(e).build())) .collect(Collectors.toSet());}我更喜欢流方式,但我有一些问题:转换为流和收集设置在性能方面有多昂贵?以这种方式使用 Stream 是可以接受的还是太过分了?还有其他一些使用 java Stream 来完成这种场景的最佳方法吗?
1 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
就性能而言,转换为流和收集为设置的成本有多高?以这种方式使用 Stream 是可以接受的还是太过分了?
首先,流已经比简单地创建一个新集合并使用循环向其中添加元素要昂贵,但除非您进行基准测试,否则您不会注意到这种成本。因此,继续对这两个示例进行基准测试。
如果您看一下 java 是如何实现流的,您会意识到它只是现有流的灵活包装器java.util.Iterator,因此使用流所获得的只是它们的灵活性(有时还有速度,但这不应该是卖点)
至于您的流示例,通过使用创建中间流会导致流变得昂贵flatMap。所有flatMap要做的就是撤消您在其中所做的操作并返回流的内容,因此您可能刚刚使用过map。
public Set<Source> getSources(String searchText) {
Set<String> urls = this.crawlerService.getUrls(searchText);
return urls.stream()
.map(e -> Source.builder().url(e).build())
.collect(Collectors.toSet());
}
添加回答
举报
0/150
提交
取消