让我们假设一个非常正常的开发行为: 我有一个Collection,需要将此Collection映射到另一个对象。 flatMap场景。
示例:
我们有一些方法必须返回一组Source objetc:
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进行这种情况的最佳方法吗?
答案 0 :(得分:0)
性能方面的成本如何转化为流并收集到 组?以这种方式使用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());
}