如何重置EventStream中的最后一个累积值?

时间:2017-08-18 00:40:21

标签: java javafx reactfx

我有一个来自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
...

2 个答案:

答案 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 ...),则还存在一些问题。 但无论如何,在我的情况下或类似的这种解决方案工作或应该工作;)