有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

只使用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) 个答案

  1. # 1 楼答案

    how expensive in performance terms is convert to stream and collect to set? It's acceptable to use Stream this way or it's an overkill?

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

    如果您看看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());
    }
    

    Java 8: performance of Streams vs Collections