0

我正试图围绕 Hazelcast Jets 累积处理器中的双功能使用。第一次尝试是一个简单的最小比较,但我想出的东西看起来很不雅。有更好的方法吗?

Vertex min = dag.newVertex("min", accumulate(()
    -> new myObject(Type.SOME_ENUM,Double.MAX_VALUE,0L), 
       (cMin, x) -> (((myObject) x).getValue() <  cMin.Value()) ? (myObject) x) : cMin,
       (cMin) -> cMin));

基本上我有一个包含 3 个字段的类:类型、值、时间戳,我想获取具有最低值的对象。

我的供应商是一个新对象,其值为 max.double,看起来不错。我的终结者只是把手穿过物体,这也很好。

但是蓄能器看起来过于复杂了。有没有办法避免将 x 强制转换为 myObject 两次?或者一些更优雅的方式,只保留双精度值,但最后仍然返回对象?无需迭代整个地图以再次获取最小值的对象?

4

2 回答 2

1

您可以将类型参数用于静态方法:

Vertex min = dag.newVertex("min", Processors.<myObject, myObject>accumulate(
                () -> new myObject(Type.SOME_ENUM,Double.MAX_VALUE,0L),
                (cMin, x) -> x.getValue() <  cMin.getValue() ? x : cMin));

我还使用了双参数构造函数,它identity()作为第三个参数提供。

顺便说一句,myObject应该是MyObject,这是 Java 约定。

于 2017-03-27T13:29:15.207 回答
1

您的表达式中没有任何内容表明累加器函数期望的项目类型(x)。从理论上讲,可以通过将已知类型的累加值传播到构成 lambda 主体的表达式中并找出它x必须与它的赋值兼容来推断,但 Java 不会这样做。

因此,您必须添加更显式的类型,例如通过在累加器函数中提供显式类型:

Vertex min = dag.newVertex("min", accumulate(() -> new MyObject(Double.MAX_VALUE),
        (MyObject acc, MyObject x) -> x.getValue() < acc.getValue() ? x : acc));
于 2017-03-27T13:45:53.063 回答