количество элементов во втором списке, которых нет в первом списке, в java - PullRequest
0 голосов
/ 05 апреля 2020

Допустим, мой первый список:

[{tenancyNumber:777,no:1}, {tenancyNumber:888,no:2}, {tenancyNumber:999,no:3}]

И мой второй список

[{tenancyNumber:444,no:4}, {tenancyNumber:999,no:5}, {tenancyNumber:666,no:6}]

Итак, если мы сравним по имени в двух списках есть 2 объекта во втором списке, которых нет в первом списке. Как это узнать в Java?

Вот что я попробовал:

final Long newAccounts = endDateData.stream()
  .map(TenancyHistory::getTenancyNumber)
  .filter(startDateData.stream().map(TenancyHistory::getTenancyNumber)::equals)
  .count();

, который выдает ошибку

[PredicateIncompatibleType] Predicate всегда будет иметь значение false, поскольку типы Stream и Long несовместимы

1 Ответ

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

Сначала вы можете создать поиск Set номеров арендаторов для ослабления в фильтре, пока выполняете итерацию по второму списку.

Set<Long> tenancies = startDateData.stream()
                                   .map(TenancyHistory::getTenancyNumber)
                                   .collect(Collectors.toSet());

Теперь сделанная вами попытка может быть исправлена ​​как;

final Long newAccounts = endDateData.stream()
                                    .map(TenancyHistory::getTenancyNumber)
                                    .filter(num -> !tenancies.contains(num)) // here
                                    .count();

Чтобы помочь вам понять сообщение об ошибке, с которым вы столкнулись, рассмотрите код

(end/start)DateData.stream().map(TenancyHistory::getTenancyNumber)

, это вернет Stream<Long>, теперь то, что вы в итоге выполнили в своем filter этап состоял в том, чтобы сравнить Stream<Long> со значением Long номера арендатора от другого Stream как

startDateData.stream().map(TenancyHistory::getTenancyNumber)::equals

, и, следовательно, прочитанное сообщение об ошибке всегда оценивалось бы как false. Так, что итоговое значение вашего всегда будет 0.

...