Предположим, objects
является List<ClassName>
, который был объявлен и инициализирован:
List<ClassName> filteredObjects = objects.stream()
.collect(Collectors.groupingBy(ClassName::getSecNumber))
.values().stream()
.flatMap(os -> os.stream().anyMatch(o -> o.getType() == Type.NEW) ?
os.stream().filter(o -> o.getType() != Type.LEGACY) :
os.stream()
).collect(Collectors.toList());
Я сделал предположение, что объекты типа Type.LEGACY
должны быть отфильтрованы, только если существует другой объектвведите Type.NEW
, который имеет тот же secNumber
.Я также сделал предположение, что вы можете иметь несколько объектов одного и того же type
и secNumber
и что их, возможно, потребуется сохранить.
Обратите внимание, что collect(Collectors.groupingBy(ClassName::getSecNumber))
возвращает карту любого типа secNumber
означает List<ClassName>
, поэтому при вызове values()
для него возвращается Collection<List<ClassName>>
, представляющий коллекцию групп объектов с одинаковыми secNumber
.
. Часть flatMap
принимает каждую группировку по secNumber
, проверяет, имеет ли группировка хотя бы один объект Type.NEW
, и, если это так, отфильтровывает объекты типа Type.LEGACY
, в противном случае она просто проходит вдоль объектов, которые должны быть сведены в конечный List<ClassName>
.Это прежде всего так, что если в группе есть только объекты типа Type.LEGACY
, то они не исключаются из окончательной коллекции.