如何为 Hazelcast Jet 制定一个优雅的顶点以获得最小值?

How to formulate an elegant vertex for Hazelcast Jet to get the minimum?

我正在努力思考 Hazelcast Jets accumulate 处理器中的双功能用法。第一次尝试是一个简单的最小比较,但我想出的东西看起来很不雅观。有更好的方法吗?

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 个字段的 class:类型、值、时间戳,我想获得具有最低值的对象。

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

但是累加器看起来复杂得没必要。有没有办法避免将 x 强制转换为 myObject 两次?或者一些更优雅的方式,只保留 double 值,但最后仍然 return 对象?无需遍历整个地图以再次获取最小值的对象?

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

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 约定。

您的表达式中没有任何内容指示累加器函数期望的项目类型(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));