Java Потоковый фильтр - как я могу отфильтровать данные, не оборачивая код фильтра в условие «если» для проверки нулевого на ключах фильтрации? - PullRequest
0 голосов
/ 17 февраля 2020

Я делаю следующее:

List<Objects> filtered = objects.stream()
    .filter(o -> source.equals(o.getSource()) && date.equals(o.getDate()) && id.equals(o.getId()))
    .collect(Collectors.toList());

, где и date, и id могут быть null, как это следует из параметров метода.

Как можно Я игнорирую их, если NULL, без упаковки вышеупомянутого кода в операторе if tp проверить 'id' и 'date' для нулевых значений? Я хочу сделать это внутри фильтра.

Редактировать: Чтобы сделать его более понятным, я хочу, чтобы фильтр действовал только на ненулевые значения, т. Е. Если дата не равна нулю и id равен нулю, то фильтровать только по дате и игнорировать идентификатор и т. д ..

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

Вы можете использовать метод stati c Objects::equals. Скорее всего, этот метод предназначен именно для этого:

List<Objects> filtered = objects.stream()
    .filter(o -> Objects.equals(source, o.getSource()) && Objects.equals(date, o.getDate()) && Objects.equals(id, o.getId()))
    .collect(Collectors.toList());

Примечание: как упомянул Скретт в комментариях, он может не отфильтровать объекты, для которых getDate() возвращает null, если date также null. То же самое касается id. Если это так, то вышеупомянутый фрагмент кода не соответствует. В этом случае мы должны явно фильтровать ненулевые даты и идентификаторы:

.filter(o -> Objects.nonNull(o.getId()) && Objects.nonNull(o.getDate()))

Обновить

Если вы хотите пропустить сравнение для getDate(), если date равно null (и то же самое для id), затем вы можете сначала проверить null, как в ответе ernest_k .

Вы можете легко создать небольшой метод для этого:

public static boolean nullOrEquals(Object baseObject, Object compareObject) {
    return baseObject == null || Objects.equals(baseObject, compareObject);
}
.filter(o -> Objects.equals(source, o.getSource())
    && nullOrEquals(date, o.getDate())
    && nullOrEquals(id, o.getId()))

Вот пример Ideone .

2 голосов
/ 17 февраля 2020

Дополнительным параметром является проверка нулей в предикате:

.filter(o -> source.equals(o.getSource()) 
             && (null == date || date.equals(o.getDate()))
             && (null == id || id.equals(o.getId())))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...