Java 8 流 - 增量收集/部分减少/间歇映射/...这叫什么?

lim*_*mbo 5 java reduce dictionary java-8 java-stream

我正在处理遵循以下模式的潜在无限数据元素流:

E1 <start mark> E2 foo E3 bah ... En-1 bar En <end mark>

也就是说,<String> 流必须先累积在缓冲区中,然后才能将它们映射到对象模型。

目标:将 a 聚合Stream<String>为 a,Stream<ObjectDefinedByStrings> 而无需收集无限流的开销。

用英语来说,代码类似于“一旦看到开始标记,就开始缓冲。缓冲直到看到结束标记,然后准备返回旧缓冲区,并准备一个新缓冲区。返回旧缓冲区。”

我当前的实现形式如下:

Data<String>.stream()
            .map(functionReturningAnOptionalPresentOnlyIfObjectIsComplete)
            .filter(Optional::isPresent)
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

  1. 这个操作正确的名称是什么?(即我可以通过 Google 搜索更多示例吗?我发现的每个讨论都.map()涉及 1:1 映射。每个关于 .reduce 的讨论)都涉及 n:1 缩减。每次讨论都.collect()讨论将累积作为终端操作......)

  2. 从很多方面来看,这似乎都很糟糕。有更好的方法来实现这个吗?(候选人的形式.collectUntilConditionThenApplyFinisher(Collector,Condition,Finisher)......?)

谢谢!

spr*_*ter 2

为了避免混乱,您可以在映射之前进行过滤。

Data<String>.stream()
    .filter(text -> canBeConvertedToObject(text))
    .map(text -> convertToObject(text))
Run Code Online (Sandbox Code Playgroud)

这在无限流上运行得非常好,并且只构造需要构造的对象。它还避免了创建不必要的可选对象的开销。