使用 Java 8 中引入的函数式接口,您可以轻松地将不同的表达式链接到一个新的表达式中,如下面的代码片段所示。
public class PredicateChaining {
public static void main(String[] args) {
// verbose, but standard JDK functionality only
Predicate<String> allUpperCase = StringUtils::isAllUpperCase;
Predicate<String> longerThan5 = s -> s.length() > 5;
if (allUpperCase.and(longerThan5).test("PREDICATE")) {
System.out.println("'PREDICATE' is a uppercase text, longer than 5.");
}
// compact, but with utility method ('chain' in this case)
if (chain(StringUtils::isAllLowerCase).and(s -> s.length() < 5).test("test")) {
System.out.println("'test' is a lowercase text, shorter than 5.");
}
}
public static <T> Predicate<T> chain(Predicate<T> test) {
return test;
}
}
在这种情况下,2 个 String Predicate被链接到一个新的Predicate中。当您至少有一个句柄(即变量)来调用链接方法(在本例中为'和')时,这可以正常工作。但是,如果要链接的表达式表示为 lambda 或方法引用,则需要将其中一个显式转换为变量,这会使其非常冗长。当编译器无法确定确切的类型时,您必须求助于这种构造。但在大多数情况下,这只是我想避免的冗长开销。
在这个例子中,我自己编写了实用方法' chain '。但我也可以为其他功能接口(Function、Consumer、Supplier、BiConsumer ……)创建一个。
我不想使用这些方法创建自己的实用程序类(我可能会将其复制粘贴到我从事的每个项目中),而是想知道这样的类是否存在于 JDK 或某个库中?
另一方面,如果这样的类不存在并且我不应该自己创建一个,我想听听为什么。