Обновите param в list1 <object>из list2 <object>, используя java 8 - PullRequest
2 голосов
/ 22 мая 2019

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

У меня есть list1 и list2, эти два объекта имеют разные типы объектов.нам нужно обновить объект (param) в list1 объектом list2 (param).

Пример

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())));

Ответы [ 3 ]

4 голосов
/ 22 мая 2019

Ваш 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()));
3 голосов
/ 22 мая 2019

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

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(..)

3 голосов
/ 22 мая 2019

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