Мне часто приходится фильтровать Stream
или использовать предикат, который проверяет, имеет ли данное поле заданное значение.
Скажем, например, у меня есть этот POJO:
public class A {
private Integer field;
public A(final Integer field) {
this.field = field;
}
public Integer getField() {
return field;
}
}
И я хочу отфильтровать Stream
объектов на основе значения field
:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> Objects.equals(a.getField(), someValue))
...
Будет ли удобный метод для создания предиката для метода filter
? Я заметил, что есть Predicate.isEqual
, но он не подходит.
Я мог бы довольно легко написать что-то вроде этого:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return v -> Objects.equals(value, f.apply(v));
}
и используйте его как:
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(isEqual(A::getField, someValue))
...
но я бы предпочел повторно использовать существующий метод из JDK, если это возможно.
someValue
не являетсяnull
, достаточно простогоa -> someValue.equals(a.getField())
. Мне он кажется не хужеisEqual(A::getField, someValue)
, особенно если учесть, чтоA
это скорееNameOfARealLifeClass
… - person Holger   schedule 23.10.2015