Вы не должны использовать API-интерфейсы Stream для изменения состояния объекта.
Если вы все еще хотите изменить его, вы можете выполнить итерацию каждого элемента из списка A
, отфильтровать, если dob равен нулю, найти dob по соответствующему имени в списке B
.
List<A> aList = new ArrayList<>();
List<B> bList = new ArrayList<>();
aList.stream()
.filter( a -> a.dob == null)
.forEach( a -> {
Predicate<B> nameFilter = b -> b.name.equals(a.name);
a.dob = findDob(nameFilter, bList);
});
static String findDob(Predicate<B> nameFilter, List<B> bList) {
B b = bList.stream()
.filter(nameFilter)
.findFirst()
.orElse(new B());
return b.dob;
}
Альтернативное эффективное решение: Учитывая, что у вас есть уникальное имя для каждого объекта B, вы можете подготовить поиск и найти возраст, используя эту карту, таким образом, вам не нужно повторять bList
за каждую итерацию aList
List<A> aList = new ArrayList<>();
List<B> bList = new ArrayList<>();
Map<String, String> nameDobLookup = bList.stream()
.collect(Collectors.toMap(b -> b.name, b -> b.dob));
aList.stream()
.filter(a -> a.dob == null)
.forEach(a -> a.dob = nameDobLookup.get(a.name));