如何按组汇总流量中的元素/如何逐组缩减?

时间:2019-01-24 10:31:53

标签: java flux project-reactor

假设您具有以下结构的对象流:

class Element {
  String key;
  int count;
}

现在想象一下那些元素按预定义的排序顺序流动,总是按键组,例如

{ key = "firstKey",  count=123}
{ key = "firstKey",  count=1  }
{ key = "secondKey", count=4  }
{ key = "thirdKey",  count=98 }
{ key = "thirdKey",  count=5  }
 .....

我想做的是创建一个通量,该通量为每个不同的key返回一个元素,并为每个键组求和count。 因此,基本上就像每个组的经典归约法一样,但是使用reduce运算符是行不通的,因为它只返回一个元素,并且我想为每个不同的键获取一个元素的通量。

使用bufferUntil可能有效,但有一个缺点,就是我必须保持状态以检查key与以前的版本相比是否已更改。

使用groupBy是一个过大的杀伤力,因为我知道一旦找到新密钥,每个组都将结束,所以我不想在该事件之后保留任何内容。

是否可以使用Flux进行聚合而不将状态保持在流程之外?

1 个答案:

答案 0 :(得分:2)

当前(从3.2.5版本开始)如果不自己跟踪状态,是不可能的。 UserDetails @OneToOne可以使票据符合最小状态,但不会发出状态,只是根据该状态将其视为“不同”的值。

解决这个问题的最简单方法是使用distinctUntilChangedwindowUntil +每个用户状态的compose

AtomicReference