为了账号安全,请及时绑定邮箱和手机立即绑定

只用Java Stream来映射好不好?

只用Java Stream来映射好不好?

慕莱坞森 2023-07-19 10:00:48
让我们假设开发中的一种非常正常的行为:我有一个 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());

}

查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 60 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信