如何在事件流中重置最后的累积值?



我有一个来自N个可观察值的合并事件流。从这个值中,我想要最小的一个。例如:

Var<Integer> a = Var.newSimpleVar(2);
Var<Integer> b = Var.newSimpleVar(3);
Var<Integer> c = Var.newSimpleVar(4);
...
EventStream<Integer> m = EventStreams.merge(a.values(), b.values(), c.values(), ...);
m = m.filter(integer -> integer > 1).accumulate((i1, i2) -> Math.min(i1, i2));
m.subscribe(integer -> System.out.println(integer));

a.setValue(0); // At this point the Input is filtered and not emitted also I dont want the last value "2" in the accumulation. 
b.setValue(5);
c.setValue(3);
//Output is always "2".

我的问题是,我希望在第一个过滤值之后还有一个用于累积的新初始化值。在这种情况下,例如"Integer.MAX_VALUE"。

因此,累积的下一个比较不是:"Math.min(2,5("->"Math.min(2,3(">

而是
"Math.min(MAX_VALUE,5(">
->"Math.min(5,3("。

所以输出不应该是:2, 2, 2, 2, 2, 2 而是 -> 2 : 输出最小值 2 b -> 3 : 输出最小值 2



c -> 4 : 输出最小值 2

a -> 0:正常条件(值<1(为真。现在重置或更好地重复流(不保留累积中的最后一个值 2(

b -> 5 : 输出最小值5
c -> 3 : 输出最小值 3 a -> 4 : 输出最小值 3

...

我只会使用

EventStreams.combine(a.values(), b.values(), c.values())
.map(t3 -> t3.map((a, b, c) -> min3(a, b, c)));

其中,您将min3定义为至少取 3 个值,但忽略零。

好的,我找到了一个解决方案。 忽略零是一个很好的提示。谢谢托马斯:)

Var<Integer> a = Var.newSimpleVar(2);
Var<Integer> b = Var.newSimpleVar(3);
Var<Integer> c = Var.newSimpleVar(4);
...
EventStream<Integer> m = EventStreams.merge(a.values(), b.values(), c.values(), ...);
m = m.accumulate((i1, i2) -> i2 < 1 ? Integer.MAX_VALUE : Math.min(i1, i2)).filter(integer -> integer != Integer.MAX_VALUE);
m.subscribe(integer -> System.out.println(integer));
a.setValue(0);
b.setValue(5);
c.setValue(3);
a.setValue(4);

输出为:a -> 2 : 输出最小值 2 b -> 3 : 输出最小值 2c -> 4 : 输出最小值 2



a -> 0 : 无输出

b -> 5 : 输出最小值5
c -> 3 : 输出最小值 3 a -> 4 : 输出最小值 3

所以问题是我无法在累积执行之前过滤(在这种情况下(。 还有一些问题,例如,如果此流中的第一个值为零(修复看起来像... (i1, i2) -> i1 < 1 ? i2 : i2 < 1 ? Integer.MAX_VALUE ...(。 但无论如何,在我的情况或类似情况下,这种解决方案有效或应该;)

相关内容

  • 没有找到相关文章

最新更新