Как использовать фильтр в Java 8 для игнорирования значений из массива int и для сбора

У меня есть список кодов ошибок, которые я хочу проверить, содержат ли они коды ошибок в отдельном массиве. Если коды ошибок существуют в списке errorCode, я хочу их отфильтровать.

Это то, что у меня есть

int[] ignoredErrorCodes = {400, 500};

  List<Error> errorCodes = errorsList.stream()
            .filter(error -> error.getErrorCode() != ignoredErrorCodes[0])
            .collect(Collectors.toList());

как я могу проверить все значения в массиве ignoredErrorCodes вместо одного, используя потоки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
857
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Было бы лучше сохранить игнорируемые коды в Set для более быстрого поиска:

Set<Integer> ignored = Set.of(400,500);
List<Error> errorCodes = errorsList.stream()
            .filter(error -> !ignored.contains(error.getErrorCode()))
            .collect(Collectors.toList());
Set может оказаться излишним для нескольких кодов ошибок (но сопли также повредят), но в любом случае имеет смысл создать коллекцию один раз перед filter.
tobias_k 18.10.2018 12:23

@tobias_k Setинтерфейс ничего не говорит о фактических накладных расходах. В случае OpenJDK реализация, возвращаемая Set.of(400,500), будет классом, содержащим два поля для двух значений, а его метод contains выглядит как boolean contains(Object o) { return o.equals(e0) || o.equals(e1); }. Что может быть дешевле? Самое замечательное в этом решении то, что оно адаптируется к размеру проблемы, то есть переключается на реализацию на основе хэша с большим количеством элементов.

Holger 18.10.2018 12:30

@Holger Я не имел в виду, что Set вызовет накладные расходы и / или будет работать медленнее, чем при отсутствии Set, просто обычный вариант «Установить быстрее для поиска» может быть неуместным в этом случае. Но, как я уже сказал, это, конечно, тоже не повредит.

tobias_k 18.10.2018 12:31

@tobias_k ну, с ним также проще обращаться, чем с массивом int[], у которого нет метода contains ...

Holger 18.10.2018 12:32

@Holger Конечно, поэтому я сказал, что имеет смысл создавать коллекцию (любую коллекцию) перед фильтром. ;-)

tobias_k 18.10.2018 12:34

Я провел тест, в котором список ошибок содержит ошибки 400, 500 и 701. Затем фильтр не отфильтровал ошибки 400 и 500, и окончательный список errorCodes списка содержит все три ошибки, а не только 701. Почему это?

user6248190 18.10.2018 13:34

@ user6248190 какой типа error.getErrorCode()?

Eran 18.10.2018 13:36

тип - это int @Eran

user6248190 18.10.2018 13:40

@ user6248190 ну, у меня нет вашего класса Error, чтобы попробовать этот код, но тестирование с List<Integer> вместо List<Error> работает, так что логика верна. P.S. Я также не использовал Set.of в своем тесте (поскольку у меня нет Java 9). Вместо этого я использовал HashSet.

Eran 18.10.2018 13:44

@Eran, вероятно, прав, Set, вероятно, лучше всего передаст ваши намерения. Однако, если вы действительно хотите работать с массивом, подумайте:

import java.util.Arrays

errorsList.stream()
        .filter(error -> Arrays.binarySearch(ignoredErrorCodes, error.getCode()) < 0)
        .collect(Collectors.toList());

не могли бы вы подробнее рассказать об этом или предоставить полный код?

user6248190 18.10.2018 13:00

@ user6248190 Этот код готов (хотя он должен читать < 0, я его отредактировал). Однако он полагается на сортируемый массив.

daniu 18.10.2018 13:40

Могу поклясться, что упомянул сортировку массива. Спасибо @daniu

Clive Evans 21.10.2018 15:41

Другие вопросы по теме