2017-03-27 1 views
0

J'essaie d'envelopper ma tête autour de l'utilisation de bifonctions dans le processeur d'accumulation de jets de Hazelcast. La première tentative est une comparaison minime simple, mais ce que j'ai trouvé semble si peu élégant. Y a-t-il une meilleure façon de le faire?Comment formuler un sommet élégant pour Hazelcast Jet pour obtenir le minimum?

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)); 

Fondamentalement, j'ai une classe avec 3 champs: Type, valeur TimeStamp, et je veux obtenir objet avec la valeur la plus faible.

Mon fournisseur est un nouvel objet avec une valeur à max.double, ce qui semble bien. Mon finisseur ne fait que passer l'objet, ce qui est bien aussi.

Mais l'accumulateur semble anormalement compliqué. Y a-t-il un moyen d'éviter d'avoir à lancer x à myObject deux fois? Ou d'une manière encore plus élégante, de garder juste la double valeur, mais toujours retourner l'objet à la fin? SANS avoir à parcourir toute la carte pour obtenir à nouveau l'objet pour la valeur min?

Répondre

1

Rien dans votre expression n'indique le type d'élément attendu par la fonction d'accumulateur (x). Théoriquement, il pourrait être déduit en propageant le type connu de la valeur accumulée dans l'expression qui constitue le corps lambda et en découvrant que x doit être compatible avec l'affectation, mais Java ne le fait pas.

Vous devez donc ajouter à taper plus explicite, par exemple en fournissant des types explicites dans la fonction de l'accumulateur:

Vertex min = dag.newVertex("min", accumulate(() -> new MyObject(Double.MAX_VALUE), 
     (MyObject acc, MyObject x) -> x.getValue() < acc.getValue() ? x : acc)); 
1

Vous pouvez utiliser des paramètres de type à méthode statique:

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)); 

J'ai aussi utilisé le constructeur à deux paramètres, qui fournit des identity() comme troisième argument.

Btw, myObject doit être MyObject, il s'agit d'une convention Java.

+0

^^ Je rebaptisés myObject à la volée pour ne pas publier des données originales. ;) –