当前位置: 首页 > 知识库问答 >
问题:

只使用Java流来映射是很好的?[副本]

师建德
2023-03-14

让我们假设开发中的一个非常正常的行为:我有一个集合,需要将这个集合映射到另一个对象。flatMap场景。

示例:

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;
}
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());

}

共有1个答案

锺离声
2023-03-14

转换为流和收集为集在性能方面有多昂贵?这样使用流是可以接受的还是矫枉过正?

首先,stream已经比简单地创建一个新集并使用循环将元素添加到其中更昂贵,但是除非您进行基准测试,否则您不会注意到这个成本。因此,继续对这两个示例进行基准测试。

如果您了解一下java是如何实现流的,您就会意识到它只是一个已经存在的java.util.iterator的灵活包装器,所以您从使用流中获得的所有好处就是它们的灵活性(有时还有速度,但这不应该是卖点)

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());
}

参见Java 8:流与集合的性能

 类似资料:
  • 在流API中映射对象的更好实践是什么? 1-带有方法引用的后续map(): 为什么呢?

  • 我有一个实体,看起来像这样: 输入数据是一个

  • 我有以下形式的地图: 让INNER成为内部地图,即。 例如,我想在一个新的中减少START映射 它们具有相同的键,但值不同。特别是,对于每个键,我希望新的Double值是相应键的INNER映射中值的SUM。 如何使用JAVA 8的流API来实现这一点? 谢谢大家。 编辑:样例地图为 我想要一张像下面这样的新地图:

  • 问题内容: 假设我有一个void方法,该方法只对对象进行转换而没有返回任何值,并且我想在流map()函数的上下文中使用它,如下所示: 该示例是为了简单起见而构成的-实际方法除了在处理对象的UUID之外,还在做其他事情。 无论如何,在上述情况下如何使用void方法?当然,我可以使该方法返回转换后的对象,但这不重要,并且违反了设计(该方法应为空)。 问题答案: 似乎是强制使用Java 8流的情况。相反

  • 假设我有一个对对象进行转换而不返回任何值的空方法,我想在stream map()函数的上下文中使用它,如下所示: 这个例子是为了简单起见——实际的方法不仅仅是搞乱对象的UUID。 不管怎样,在上面这样的场景中如何使用空方法?当然,我可以让该方法返回转换后的对象,但这不是重点,并且违反了设计(该方法应该是空的)。