【问题标题】:The best way to collect the Java-8 Stream to Guava ImmutableList将 Java-8 Stream 收集到 Guava ImmutableList 的最佳方式
【发布时间】:2014-11-11 20:02:34
【问题描述】:

我想将流放入不可变列表中。以下方法之间有什么区别,从性能角度来看哪一种更好?

  1. collect( Collectors.collectingAndThen(Collectors.toList(), ImmutableList::copyOf));

  2. ImmutableList.copyOf( stream.iterator() );

  3. collect( Collector.of( ImmutableList.Builder<Path>::new, ImmutableList.Builder<Path>::add, (l, r) -> l.addAll(r.build()), ImmutableList.Builder<Path>::build) );

关于性能或效率的更多参数,

  1. 列表/集合中可能有很多条目。

  2. 如果我想对集合进行排序,使用中间操作".sorted()" 和自定义比较器。

  3. 因此,如果我将.parallel() 添加到流中会怎样

【问题讨论】:

标签: java java-8 guava java-stream


【解决方案1】:

对于系统性能,你需要衡量它。

为了编程性能,使用最清晰的方式。单从外观来看,我最喜欢第二个,而且我看不出那里有明显的低效。

【讨论】:

    【解决方案2】:

    我希望 1) 是最有效的:通过额外的构建器似乎不太可读,不太可能赢得正常的toList(),并且从迭代器复制会丢弃大小信息。

    (但 Guava 正在努力添加对类似 Java 8 的支持,您可能只是等待。)

    【讨论】:

    • 谢谢,您能否详细说明“从迭代器复制丢弃大小信息”
    • A Stream.iterator() 不知道它的大小。通过toList() 获取您的列表。不过,无论哪种方式都可以争论——当你构建List时,你会丢失大小信息,但是当你将它复制到ImmutableList时,你会得到它。
    猜你喜欢
    • 2017-07-03
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多