Вы можете использовать метод 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 .