Слияние двух списков на основе условия и pu sh результата на карту, используя java 8 - PullRequest
1 голос
/ 13 апреля 2020

У меня есть два списка: исходный и целевой, я хочу объединить их, основываясь на каком-то условии, и передать sh данные в Hashmap. Я попробовал приведенный ниже код, но не смог добиться успеха.

public List<Persona> fetchCommonPersonas(List<User> sourceList,
                                             List<User> targetList) {
final Map<String, String> map = new HashMap<>();
       map = sourceList.stream()
                .filter(source -> targetList.stream().anyMatch(destination -> {
                    if(destination.getAge().equals(source.getAge())) {
                        map.put(source.getUserId(), destination.getUserId());
                    }
                }
                ));    
}

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вот один из способов сделать это:

Map<String, String> map = 
    sourceList.stream()
              .map(source -> targetList.stream()
                                       .filter(dest -> dest.getUserId().equals(source.getUserId()))
                                       .map(dest -> new SimpleEntry<>(source.getPersonaId(), dest.getPersonaId()))
                                       .firstFirst())
              .filter(Optional::isPresent)
              .map(Optional::get)
              .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));   

Для каждого элемента списка источников вы найдете соответствующий элемент списка целей, сопоставьте эти элементы с Map.Entry, который содержит идентификаторы двух человек. и собрать все записи в Map.

0 голосов
/ 14 апреля 2020

После того, как я получил информацию от Эрана, это последний кусок кода

Map<String, String> commonMap = sourceList.stream()
        .flatMap(source -> targetList.stream()
        .filter(target -> source.getUserId().equals(target.getUserId()))
        .map(target -> new AbstractMap.SimpleImmutableEntry<>(sourcePersona.getPersonaId(), targetPersona.getPersonaId())))
        .filter(immutableEntry -> (immutableEntry != null
                && StringUtils.isNotBlank(immutableEntry.getKey()) && StringUtils.isNotBlank(immutableEntry.getValue())))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
0 голосов
/ 13 апреля 2020

Вы можете использовать groupingBy списка источников для поиска данных на втором этапе, а затем collect пары идентификаторов цели и источника следующим образом -

Map<Integer, List<String>> sourceGrouping = sourceList.stream()
        .collect(Collectors.groupingBy(User::getAge,
                Collectors.mapping(User::getId, Collectors.toList())));

Map<String, String> map = targetList.stream()
        .filter(u -> sourceGrouping.containsKey(u.getAge()))
        .flatMap(u -> sourceGrouping.get(u.getAge())
                .stream().map(s -> new AbstractMap.SimpleEntry<>(s, u.getId())))
        .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, 
                AbstractMap.SimpleEntry::getValue));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...