在一条语句中使用 and/or/negate 方法创建谓词?

Create Predicate with and/or/negate methods in one statement?

java.util.function.Predicate 有一些有用的方法,如 andor 等,比使用多个逻辑运算符创建括号狂欢更简洁。不幸的是,如果不首先明确地使用谓词,似乎无法使用这些函数...

Predicate<String> predicate = String::isEmpty;
Predicate<String> predicateWithAnd = predicate.and( MyClass::testSomething ); 

有没有办法只在一个语句中创建第二个谓词(因此 "saving" 一个变量),比如...

Predicate<String> predicateWithAnd = (String::isEmpty).and( MyClass::testSomething );  // That doesn't seem to work ;-)

只是好奇...

是的,您需要将 lambda 转换为 Predicate 类型,其中 T 是您的类型。人物 class.

的示例
Predicate<Person> a = ((Predicate<Person>)p -> p.getId() > 2)
                                     .and(p -> p.getPrice() > 100);

不太清楚为什么 str -> str.isEmpty() && MyClass.testSomething(str) 被称为 "bracket orgy"。它易读且简短。通常,当您准备好 Predicate 个对象时,这些 andor 方法很有用。您不应使用它们来组合方法引用或 lambda。

如果真的要使用方法引用,也没什么技巧。首先,您可以像这样创建自己的实用程序 class:

import java.util.function.Predicate;
import java.util.stream.Stream;

public class Predicates {
    @SafeVarargs
    public static <T> Predicate<T> and(Predicate<T>... preds) {
        return Stream.of(preds).reduce(Predicate::and).orElse(x -> true);
    }

    @SafeVarargs
    public static <T> Predicate<T> or(Predicate<T>... preds) {
        return Stream.of(preds).reduce(Predicate::or).orElse(x -> false);
    }
}

并像这样使用它:

import static mypackage.Predicates.*;

Predicate<String> predicateWithAnd = and(String::isEmpty, MyClass::testSomething);

或者你可以只创建一个非常无用的静态方法:

public static <T> Predicate<T> pred(Predicate<T> pred) {
    return pred;
}

并像这样使用它:

pred(String::isEmpty).and(MyClass::testSomething);

这比显式类型转换要短得多。但是我仍然会建议继续使用像 str -> str.isEmpty() && MyClass.testSomething(str).

这样的显式 lambda