Вы можете передавать List<Age>
внутри итерации элементов List<Employee>
:
list1.forEach(e -> e.setAge(
list2.stream() // Stream<Age>
.filter(a -> a.getName().equals(e.getName())) // ... find the name match
.map(Age::getAge) // ... extract the age
.findAny().orElse("unknown"))); // ... return it or else "unknown"
- Если совпадений имен не найдено, значение по умолчанию устанавливается на
unknown
. - Кроме того, вы должны убедиться, что нет дублирующихся имен, на которых основан возраст.
- Возраст
String
- это нормально? - Вы Вы уверены, что нет значений
null
?
Если вы хотите удалить такие несопоставленные записи, я предлагаю вам использовать Iterator
с Map<String, List<Age>>
:
Map<String, List<Age>> map = list2.stream()
.collect(Collectors.groupingBy( // Map<String, List<Age>>
Age::getName)); // ... where 'name' is the key
final Iterator<Employee> iterator = list1.iterator();
while (iterator.hasNext()) { // Iterating List<Employee>
final Employee e = iterator.next(); // Employee
if (map.containsKey(e.getName())) { // If there is Age with equal 'name'
final String age = map.get(e.getName()) // ... get the first found age
.get(0).getAge();
e.setAge(age); // ... set it to the Employee
} else iterator.remove(); // ... or else remove the Employee
}
Опять заботимся о пунктах, которые я перечислил выше. Более того, если вы не хотите использовать первый найденный возраст map.get(e.getName()).get(0).getAge()
, вам нужно выполнить Stream::reduce
над Stream<Age>
, например:
// null doesn't occurunless the Age::getAge returns null
// The reducing would be much easier if the age is int
// Feel free to find max/min of the ages... up to you
String age = map.get(e.getName()).stream().map(Age::getAge).reduce(...).orElse(null);
Вывод: java -stream - это неуклюжий путь, и я лично придерживаюсь процедурного подхода -1036 *.