Да, вы можете объединить их в один конвейер следующим образом:
list.stream()
.map(a -> new A(a.getCode(), a.getTimestamp(),
list.stream()
.filter(b -> a.getCode().equals(b.getCode()))
.mapToLong(A::getTimestamp)
.max().getAsLong()))
.collect(Collectors.toList());
или если вы хотите избежать создания нового списка, но вместо этого изменить существующий, как в вашемзатем используйте replaceAll
:
list.replaceAll(a -> new A(a.getCode(), a.getTimestamp(),
list.stream()
.filter(b -> a.getCode().equals(b.getCode()))
.mapToLong(A::getTimestamp)
.max().getAsLong()));
Однако я бы рекомендовал избегать этого подхода:
1), поскольку он имеет более низкую производительность, чем ваша текущая реализация, это решение требует итерации по list
снова forEach
элемент в нем.Принимая во внимание, что подход к карте, который вы показали, требует только одного вызова get
, и мы все знаем, насколько быстро выполняется поиск на карте.
2) Там больше кода.
Да, вы можете преобразовать код внутри промежуточной операции map
в метод, чтобы он выглядел короче, но в конечном итоге он все еще длиннее.
Иногда лучший подход требует двух или более отдельных строк, и в этом случае лучше продолжить ваш подход.