Java 8 предикат ИЛИ и удалить, если странное поведение - PullRequest
0 голосов
/ 06 июня 2018

Хорошо, поэтому я хотел использовать Predicate.or (другое) вместо записи ||внутри предиката, но когда я использую с removeIf ArrayList, похоже, что выполняется только первая проверка, вот пример кода:

    public static void main(String... args) {
    List<String> leters = new ArrayList<>(Arrays.asList("A", "B", "C"));
    Predicate<String> predicate = str -> str.equals("A");
    predicate.or(str -> str.equals("B"));
    predicate.or(str -> str.equals("C"));
    leters.removeIf(predicate);
    System.out.println(leters); // Prints B,C. I was acpecting to get an empty list

    Predicate<String> predicate2 = str -> str.equals("A") || str.equals("B") || str.equals("C");
    leters = new ArrayList<>(Arrays.asList("A", "B", "C"));
    leters.removeIf(predicate2);
    System.out.println(leters); // Prints []
}

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вы игнорируете результат из метода or, следовательно, результат:

Вместо этого выполните:

 predicate = predicate.or(str -> str.equals("B"))
                      .or(str -> str.equals("C"));
0 голосов
/ 06 июня 2018

or возвращает новое Predicate, но вы игнорируете возвращенное значение:

Predicate<String> predicate = str -> str.equals("A");
predicate = predicate.or(str -> str.equals("B"));
predicate = predicate.or(str -> str.equals("C"));
0 голосов
/ 06 июня 2018

predicate.or(str -> str.equals("B")) не изменяет оригинал Predicate, он возвращает новый.

Вам необходимо присвоить возвращенные Predicate s переменной predicate:

Predicate<String> predicate = str -> str.equals("A");
predicate = predicate.or(str -> str.equals("B"));
predicate = predicate.or(str -> str.equals("C"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...