我试图用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?或者一些更优雅的方式,只是保持双值,但仍然返回到底的对象?无需迭代到整个地图再次获得最小值的对象?
答案 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));