【问题标题】:Java Stream API - is it possible to create Collector that is collecting result to a new stream?Java Stream API - 是否可以创建将结果收集到新流的收集器?
【发布时间】:2021-06-24 22:27:48
【问题描述】:

所以,这个问题不言自明:有没有办法创建一个收集器,即将传递给它的流收集到一个新流中?

我知道这可以通过一些技巧来完成,例如:

Collectors.collectingAndThen(Collectors.toList(), List::stream);

但是这段代码分配了冗余内存。

解释为什么我首先需要这个:有时我想将一些东西传递给Collectors.groupingBy,然后在下游执行 stream 操作,而不需要额外的时间。 p>

有没有一种简单的方法来做到这一点(无需编写我自己的实现收集器接口的类)?

编辑:这个问题已被标记为与this 问题的重复,但这不是我想要的。我不想复制原始流,我想关闭它并通过收集器以相同的顺序生成一个由相同元素组成的新流,而不需要在两者之间分配内存。

【问题讨论】:

  • 收集器,将流收集到一个集合中。在集合之前,它始终是一个流。如果您仍然想使用流,为什么要收集它?也许我还没有理解你的意思更深层次的东西,但在我看来,你想收集你的流,然后再流它。
  • 我在问题中描述的构造在我将收集器传递给另一个收集器时很有用,例如Collectors.groupingBy,因此它将在另一个流上运行。

标签: java functional-programming java-stream


【解决方案1】:

collect 方法将接受一个收集器。

部分采集器如下

  • 供应商 - 例如,对于流,它可以是 Stream.empty()
  • 累加器 - 对于流,我们可以使用Stream.concat()
  • Combiner - 因为这需要BinaryOperator,所以您需要处理第一个元素,因为它将作为参考。例如,对于列表,您会得到 l1l2,通常会使用 l1.addAll(l2)

因此,除了非常复杂之外,内存分配方面的开销将比首先收集集合中的所有内容更大。

一切皆有可能,但是,您可能需要编写自己的收集器来满足您的需求。

您甚至可以重写与groupingBy 完全相同的收集器,但这真的值得吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-03-12
    • 2015-07-27
    相关资源
    最近更新 更多