只使用Java流来映射是好的吗?
让我们假设开发中的一个非常正常的行为: 我有一个集合,需要将此集合映射到另一个对象。平面图场景
例如:
我们有一些方法必须返回一组源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流的另一个实现:
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流实现这种场景
# 1 楼答案
首先,流已经比简单地创建一个新集合并使用循环向其中添加元素要昂贵,但是除非您进行基准测试,否则您不会注意到这一成本。因此,请继续测试这两个示例
如果您看看java是如何实现流的,您会意识到它只是对现有
java.util.Iterator
的一个灵活包装,因此使用流所获得的只是它们的灵活性(有时是速度,但这不应该是卖点)对于您的流示例,您使用
flatMap
创建中间流会导致流的开销增加。所有flatMap
将要做的就是撤销您在那里所做的操作并返回流的内容,因此您最好首先使用map
见Java 8: performance of Streams vs Collections