Как сравнить список объектов с длинным списком в Java 8 - PullRequest
2 голосов
/ 09 ноября 2019

Я пытаюсь сравнить 2 списка, первый тип списка - «Длинный», а второй - «Объект сотрудника», и я хочу, чтобы набор результатов был в Map<ID, Exists> (Map<Long, Boolean>).

Примечание: в первом списке большеЭлемент из второго списка

List<Employee> employees = List.of(new Employee(2), new Employee(4), new Employee(6));
List<Long> ids = List.of(1L, 2L, 3L, 4L, 5L, 6L);

мне нужен вывод

1 : false
2 : true
3 : false
4 : true
5 : false
6 : true

мой код:

resultMap = employees.stream().collect( Collectors.toMap(Employee::getId, ( 
                 anything -> 
                                 ids.contains(anything.getId() ) )));
for (Entry<Long, Boolean> entity : resultMap.entrySet()) {
   System.out.println(entity.getKey() + " : " + entity.getValue());
}

, но вывод:

2 : true
4 : true
6 : true

Ответы [ 4 ]

4 голосов
/ 09 ноября 2019

Попробуйте:

Set<Long> employeesId =repository.getByIds(ids).stream()
          .map(Employee::getId)
          .collect(Collectors.toSet());

, затем

Map<Long,Boolean> map =  ids.stream()
                    .collect(Collectors
                        .toMap(Function.identity(),id->employeesId.contains(id)));
2 голосов
/ 09 ноября 2019

Поскольку в первом списке больше элементов, чем в списке сотрудников, я думаю, что ваша логика обратна, вместо этого вы должны проверить, существуют ли все элементы в идентификаторах сотрудников, чтобы решить вашу проблему, я думаю, вам нужно:

// store the employee ids in a list
Set<Long> empIds = employees.stream()
        .map(Employee::getId)
        .collect(Collectors.toSet());

// for each element in ids, check if it exist in empIds or not
Map<Long, Boolean> resultMap = ids.stream()
        .collect(Collectors.toMap(Function.identity(), e -> empIds.contains(e)));
0 голосов
/ 10 ноября 2019

я мог бы написать эти коды

1.

resultMap = ids.stream().collect(Collectors.toMap(id -> id, id -> list.stream().anyMatch(item -> item.getId().equals(id))));

2.

ids.forEach(id -> resultMap.put(id, list.stream().anyMatch(item -> item.getId().equals(id))));
0 голосов
/ 09 ноября 2019

При ids.contains(anything.getId()) проблема в том, что вы проверяете, что идентификатор сотрудника находится в списке allId, это всегда будет верно для идентификаторов сотрудников, которые у вас есть, вы можете проверить другим способом


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

Set<Long> empIds = employees.stream().map(Employee::getId).collect(Collectors.toSet());
resultMap = ids.stream().collect(Collectors.toMap(Function.identity(), empIds::contains));

Вы можете сделать это в одной строке, но это будет неэффективно, потому что вы будете перенаправлять сотрудников каждый раз

resultMap = ids.stream().collect(Collectors.toMap(id -> id, 
                         id -> employees.stream().anyMatch(e -> e.getId().equals(id))));
...