Из вашего описания единственное, что всплывает в моей голове - это отражение.
Вы также можете определить нижестоящую функцию:
BinaryOperator<T> downstream = (t1, t2) -> new T(t1.getValue() + t2.getValue(), ..., t1.getDate().isBefore(t2.getDate()) ? t1.getDate() : t2.getDate());
И затем уменьшить:
T aggregate = list.stream().reduce(downstream).get();
T result = new T(aggregate.getValue() / list.size(), aggregate.getDate(), ...)
PS1: обратите внимание, что это создает дополнительные издержки, так как создает новый объект в BinaryOperator
, поэтому это может быть не лучшим решением, когда список большой.
PS2: Это черновик,Я предположил, что вы используете LocalDateTime
для хранения date
поля, это зависит от того, что вы используете.
PS3: вам нужно определить метод агрегирования для ваших полей, например id
.
PS4: Как заметил @Aaron - я вычисляю сумму для поля value
, чтобы затем разделить ее на длину результата, чтобы среднее значение было правильно рассчитано.