如何为Hazelcast Jet制定一个优雅的顶点以获得最低限度?

时间:2017-03-27 06:16:04

标签: java hazelcast-jet

我试图用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个字段的类:Type,Value,TimeStamp,我想获得具有最低值的对象。

我的供应商是一个价值在max.double的新对象,看起来不错。我的终结者只需穿过那个很好的物体。

但累加器看起来不必要复杂。有没有办法避免必须两次将x转换为myObject?或者一些更优雅的方式,只是保持双值,但仍然返回到底的对象?无需迭代到整个地图再次获得最小值的对象?

2 个答案:

答案 0 :(得分: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惯例。

答案 1 :(得分: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));