2017-03-27 30 views
0

我試圖把我的頭包圍在Hazelcast Jets積累處理器中的雙功能用法。第一次嘗試是一個簡單的分鐘比較,但我提出的看起來很不雅觀。有沒有更好的方法來做到這一點?如何爲Hazelcast Jet制定一個優雅的頂點以獲得最小值?

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價值,這看起來不錯的新對象。我的修整機只是通過這個很好的物體。

但蓄電池看起來unneccesarily複雜。有沒有辦法避免必須將x強制轉換爲myObject兩次?或者更優雅的方式,只保留雙精度值,但最後還是返回對象?不需要迭代到整個映射以再次獲取最小值的對象?

回答

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)); 
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約定。

+0

^^我改名的飛行myObject的不公佈原始數據。 ;) –

相關問題