让我们假设开发中的一个非常正常的行为:我有一个集合,需要将这个集合映射到另一个对象。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());
}
转换为流和收集为集在性能方面有多昂贵?这样使用流是可以接受的还是矫枉过正?
首先,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。 不管怎样,在上面这样的场景中如何使用空方法?当然,我可以让该方法返回转换后的对象,但这不是重点,并且违反了设计(该方法应该是空的)。