У меня есть поток объектов (Список) и вы хотите создать новые объекты из этого потока, которые нужно вставить в Set. Тем не менее, два или более объекта во входящем списке могут иметь хеш к одному и тому же ключу в наборе, и в этом случае я хочу добавить строку из объекта n-го списка к уже существующему в наборе вместо создания нового.Условное сопоставление с новыми объектами с потоком Java
Нечто подобное, но в функциональной форме:
HashSet<ClassB> mySet = new HashSet<>();
for (ClassA instanceA : classAList) {
if (mySet.contains(ClassB.key(instanceA))) { //static method call to find the key
mySet.get(instanceA).appendFieldA(instanceA.getFieldA());
} else {
mySet.add(new ClassB(instanceA));
}
}
return mySet;
В функциональной форме я хотя создать что-то вроде этого:
List classAList = new ArrayList<>();
classAList.stream()
.map(instanceA -> new ClassB(instanceA))
.collect(Collectors.toSet());
Но тогда, конечно, игнорирует HashMap и я не» t получить для объединения полей мои множественные экземпляры ClassA, которые будут разрешены к одному и тому же ClassB. Я не знаю, как это сделать. Нужно ли игнорировать вызов map() и вместо этого создавать пользовательский сборщик? Кажется, существует несколько способов сделать это, но я новичок в Streams.
Ну, проблема с той самой идеей является то, что если поведение основано на состоянии (будь то конфликтующие-хеш объект в уже Комплексе), то вы больше не делать вещи функционально , – childofsoong
Что означает «mySet.get (instanceA)»? Я думаю, вы запутываете карты и наборы. Можете ли вы вставить свой фактический код? – Misha