Обновить параметр в list1<object> из list2<object> с помощью java 8

У меня есть два списка счетов объектов и зарплат, и мне нужно повторить список объектов. Если идентификатор совпадает, мне нужно обновить объект учетной записи.

У меня есть 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())));

// я пробовал это list1.stream().flatMap(x -> list2 .stream() .filter(y -> x.getId().equals(y.getId()))));

Raju Sidda 22.05.2019 08:49

На мой взгляд, нет смысла переписывать этот итеративный код на потоки java 8, потому что это не дает вам никаких преимуществ в производительности, а только усложняет читаемость.

Golov Pavel 22.05.2019 08:58

@GolovPavel, то есть, если списки не большие, в этом случае параллельная потоковая передача здесь выиграет

Sharon Ben Asher 22.05.2019 09:00

@Шарон Бен Ашер, хорошо, если список большой, он может быть полезен

Golov Pavel 22.05.2019 09:09

@GolovPavel, посмотри на мой ответ и скажи, как удобочитаемость

Sharon Ben Asher 22.05.2019 09:11

@SharonBenAsher Это хорошо, но, на мой взгляд, обычные внутренние циклы более интуитивно понятны по сравнению с внутренними потоками. Я думаю, это вопрос мнения.

Golov Pavel 22.05.2019 09:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Последняя операция 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(..)

Другие вопросы по теме