Ответ 1
Нет такого встроенного метода factory, который вы можете легко проверить, просмотрев все использования Predicate
в JFC и найдите "Методы в..., которые возвращают Предикат". Помимо методов внутри Predicate
, существует только Pattern.asPredicate()
, который возвращает Predicate
.
Прежде чем вы начнете внедрять такой метод factory, вы должны спросить себя, действительно ли это стоит. То, что делает ваше лямбда-выражение в .filter(a -> Objects.equals(a.getField(), someValue))
сложным, - это использование Objects.equals
, которое не требуется, если вы можете предсказать хотя бы один аргумент, является ли это null
. Поскольку здесь someValue
никогда не null
, вы можете упростить выражение:
final Integer someValue = 42;
Stream.of(new A(42), new A(1729), new A(42), new A(87539319), new A(null))
.filter(a -> someValue.equals(a.getField()))
…
Если вы все еще хотите реализовать метод factory и выиграть цену за творческое использование того, что уже существует, вы можете использовать:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return f.andThen(Predicate.isEqual(value)::test)::apply;
}
Однако для производственного кода Id скорее рекомендую реализацию следующим образом:
public static <T,R> Predicate<T> isEqual(Function<? super T, ? extends R> f, R value) {
return value==null? t -> f.apply(t)==null: t -> value.equals(f.apply(t));
}
Это заставляет проверить, является ли константа null
, чтобы упростить операцию, которая будет выполняться в каждом тесте. Так что ему все равно не нужно Objects.equals
. Обратите внимание, что Predicate.isEqual
делает подобное.