我有一个来自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 ...
(。 但无论如何,在我的情况或类似情况下,这种解决方案有效或应该;)