我有一个来自N个可观察值的合并EventStream。从这个值我想要最小的一个。例如:
var _ = require('lodash')
// Initial Data
var myArray = [{
id: '8',
name: 'hfh',
consumed_date: '2017-03-14',
calories: 8952
},
{
id: '7',
name: 'onion',
consumed_date: '2017-03-14',
calories: 224
},
{
id: '6',
name: 'onion',
consumed_date: '2017-03-14',
calories: 279
},
{
id: '2',
name: 'Ready-to-Serve Chocolate Drink',
consumed_date: '2017-01-01',
calories: 3036
}]
// sum the calories over the dates
var result = _(myArray)
.groupBy('consumed_date')
.map( (item, key) => ({
date: key,
calories: _.sumBy(item, 'calories')
}))
.value()
console.log('result', result)
我的问题是我想在第一个过滤后的值也是一个新的init值来累积。在这种情况下,例如“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
但是
a - > 2:输出最小2
b - > 3:输出最小2
c - > 4:输出最小值2
a - &gt; 0:OK条件(值<1)为真。现在重置或更好地重复流(不保留累积中的最后一个值2)
b - &gt; 5:输出最小5
c - &gt; 3:输出最小3
a - &gt; 4:输出最小3
...
答案 0 :(得分:1)
我会用
EventStreams.combine(a.values(), b.values(), c.values())
.map(t3 -> t3.map((a, b, c) -> min3(a, b, c)));
您可以定义min3
以取最少3个值,但忽略零。
答案 1 :(得分:0)
好的,我找到了解决方案。 忽略零是一个非常好的暗示。谢谢托马斯:)
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 - &gt; 2:输出最小2
b - &gt; 3:输出最小2
c - &gt; 4:输出最小值2
a - &gt; 0:无输出
b - &gt; 5:输出最小5
c - &gt; 3:输出最小3
a - &gt; 4:输出最小3
所以问题是我在累积执行之前无法过滤(在这种情况下)。
例如,如果此流中的第一个值为零(修复程序看起来像... (i1, i2) -> i1 < 1 ? i2 : i2 < 1 ? Integer.MAX_VALUE ...
),则还存在一些问题。
但无论如何,在我的情况下或类似的这种解决方案工作或应该工作;)