Как сформулировать элегантную вершину для 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? Или какой-то еще более элегантный способ просто сохранить двойное значение, но все же вернуть объект в конце? БЕЗ необходимости перебирать всю карту, чтобы снова получить объект для минимального значения?


person Anders Bernard    schedule 27.03.2017    source источник


Ответы (2)


В вашем выражении нет ничего, что указывало бы на тип элемента, ожидаемого функцией аккумулятора (x). Теоретически это можно сделать, распространив известный тип накопленного значения на выражение, составляющее тело лямбды, и выяснив, что x должен быть совместим с ним по присваиванию, но Java этого не делает.

Таким образом, вы должны добавить более явную типизацию, например, предоставив явные типы в функции-аккумуляторе:

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

Вы можете использовать параметры типа для статического метода:

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.

person Oliv    schedule 27.03.2017
comment
^^ Я переименовал myObject на лету, чтобы не публиковать исходные данные. ;) - person Anders Bernard; 27.03.2017