У меня есть список кодов ошибок, которые я хочу проверить, содержат ли они коды ошибок в отдельном массиве. Если коды ошибок существуют в списке errorCode, я хочу их отфильтровать.
Это то, что у меня есть
int[] ignoredErrorCodes = {400, 500};
List<Error> errorCodes = errorsList.stream()
.filter(error -> error.getErrorCode() != ignoredErrorCodes[0])
.collect(Collectors.toList());
как я могу проверить все значения в массиве ignoredErrorCodes вместо одного, используя потоки?




Было бы лучше сохранить игнорируемые коды в Set для более быстрого поиска:
Set<Integer> ignored = Set.of(400,500);
List<Error> errorCodes = errorsList.stream()
.filter(error -> !ignored.contains(error.getErrorCode()))
.collect(Collectors.toList());
@tobias_k Setинтерфейс ничего не говорит о фактических накладных расходах. В случае OpenJDK реализация, возвращаемая Set.of(400,500), будет классом, содержащим два поля для двух значений, а его метод contains выглядит как boolean contains(Object o) { return o.equals(e0) || o.equals(e1); }. Что может быть дешевле? Самое замечательное в этом решении то, что оно адаптируется к размеру проблемы, то есть переключается на реализацию на основе хэша с большим количеством элементов.
@Holger Я не имел в виду, что Set вызовет накладные расходы и / или будет работать медленнее, чем при отсутствии Set, просто обычный вариант «Установить быстрее для поиска» может быть неуместным в этом случае. Но, как я уже сказал, это, конечно, тоже не повредит.
@tobias_k ну, с ним также проще обращаться, чем с массивом int[], у которого нет метода contains ...
@Holger Конечно, поэтому я сказал, что имеет смысл создавать коллекцию (любую коллекцию) перед фильтром. ;-)
Я провел тест, в котором список ошибок содержит ошибки 400, 500 и 701. Затем фильтр не отфильтровал ошибки 400 и 500, и окончательный список errorCodes списка содержит все три ошибки, а не только 701. Почему это?
@ user6248190 какой типа error.getErrorCode()?
тип - это int @Eran
@ user6248190 ну, у меня нет вашего класса Error, чтобы попробовать этот код, но тестирование с List<Integer> вместо List<Error> работает, так что логика верна. P.S. Я также не использовал Set.of в своем тесте (поскольку у меня нет Java 9). Вместо этого я использовал HashSet.
@Eran, вероятно, прав, Set, вероятно, лучше всего передаст ваши намерения. Однако, если вы действительно хотите работать с массивом, подумайте:
import java.util.Arrays
errorsList.stream()
.filter(error -> Arrays.binarySearch(ignoredErrorCodes, error.getCode()) < 0)
.collect(Collectors.toList());
не могли бы вы подробнее рассказать об этом или предоставить полный код?
@ user6248190 Этот код готов (хотя он должен читать < 0, я его отредактировал). Однако он полагается на сортируемый массив.
Могу поклясться, что упомянул сортировку массива. Спасибо @daniu
Setможет оказаться излишним для нескольких кодов ошибок (но сопли также повредят), но в любом случае имеет смысл создать коллекцию один раз передfilter.