У меня есть два списка счетов объектов и зарплат, и мне нужно повторить список объектов. Если идентификатор совпадает, мне нужно обновить объект учетной записи.
У меня есть list1 и list2, эти два объекта относятся к разным типам объектов. нам нужно обновить объект (парам) в списке1 с помощью объекта списка2 (парам).
if (accounts !=null && salaries!=null) { // checking for nulls
for (Account obj1 : accounts) {// iterating objects
for (Salary obj2 : salaries) {
String id = ibj2.getId();
if (id.equals(obj1.getId())) {// id checks
obj1.setxxxx(obj2.getxxxx());// set the value
}
}
}
}
Я старался:
list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId())));
На мой взгляд, нет смысла переписывать этот итеративный код на потоки java 8, потому что это не дает вам никаких преимуществ в производительности, а только усложняет читаемость.
@GolovPavel, то есть, если списки не большие, в этом случае параллельная потоковая передача здесь выиграет
@Шарон Бен Ашер, хорошо, если список большой, он может быть полезен
@GolovPavel, посмотри на мой ответ и скажи, как удобочитаемость
@SharonBenAsher Это хорошо, но, на мой взгляд, обычные внутренние циклы более интуитивно понятны по сравнению с внутренними потоками. Я думаю, это вопрос мнения.
Последняя операция obj1.setxxxx(obj2.getxxxx());
требует наличия и obj1
, и obj2
. который диктует элемент, который передается из обоих списков
list1.stream()
.forEach(obj1 ->
list2.stream()
.filter(obj2 -> obj1.getId().equals(obj2.getId()))
.findFirst()
.ifPresent(obj2 -> obj1.setxxxx(obj2.getxxxx()))
);
Ваш flatMap
(предложенный в комментарии) создаст Stream<Salary>
, что не позволит вам изменить соответствующие экземпляры Account
.
Вы можете создать Stream
из Account
и соответствующих им Salary
и запустить forEach
на этом Stream
:
accounts.stream()
.flatMap(a->salaries.stream()
.filter(s -> s.getID().equals(a.getID())
.map(s -> new SimpleEntry<Account,Salary)(a,s)))
.forEach(e -> e.getKey().setxxxx(e.getValue().getxxxx()));
Я всегда предлагаю создать карту, так как стоимость поиска уменьшится, и она станет более читаемой.
Map<String, List<Salary>> salaryById = salaries.stream().collect(Collectors.groupingBy(Salary::getId));
accounts.forEach(a -> CollectionUtils.emptyIfNull(salaryById.get(a.getId())).forEach(s -> s.setxxxx(..)));
В случае, если Зарплата Аккаунта <-> Аккаунт Один к Одному, вы меняете группировку на Collectors.toMap(..)
// я пробовал это list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId()))));