Предикат в Java11 фильтрует все элементы - PullRequest
0 голосов
/ 06 января 2019

Я переезжаю на использование Java11. Изучая новый метод Predicate.not , я нашел свой текущий код, чтобы найти только семейство кошек как:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);

вывод:

леопард, кот, лев

Теперь я пытаюсь использовать новый метод, и вывод идет неправильно. Как мне это исправить? Что я сделал не так?

Мой более поздний код:

Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);

Но теперь выводится весь мой список.

лошадь, леопард, кошка, собака, лев

1 Ответ

0 голосов
/ 06 января 2019

Что я сделал не так?

Вы, похоже, упускаете основные законы Деморгана , в которых говорится, что

!(a || b) == !a && !b

и

!(a && b) == !a || !b

Как мне это исправить?

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

Predicate.not(a -> a.equals("dog") || a.equals("horse")); // !(a || b)

, который должен быть эквивалентен вашему существующему коду

Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");

, который также можно рассматривать как:

Predicate<String> notDog = a -> !a.equals("dog");
Predicate<String> notHorse =  a -> !a.equals("horse");
Predicate<String> cats = notDog.and(notHorse); // !a && !b
...