用于引导 lambda 表达式或方法引用以进行方法链接的实用程序类?

Erw*_*ont 1 java lambda method-chaining java-8 method-reference

通过 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在本例中,2 个 String Predicate被链接到一个新Predicate中。当您至少有一个句柄(即变量)来调用链接方法(在本例中为“”)时,这种方法效果很好。但是,如果要链接的表达式表示为 lambda 或方法引用,则需要将其中之一显式转换为变量,这会使其非常冗长。当编译器无法确定确切的类型时,您必须求助于这种构造。但在大多数情况下,这只是我想避免的冗长开销。

在这个例子中,我自己编写了实用方法“ chain ”。但我也可以为其他功能接口(FunctionConsumerSupplierBiConsumer ,...)创建一个。

我不想使用这些方法创建我自己的实用程序类(我可能会将其复制粘贴到我从事的每个项目中),而是想知道这样的类是否存在于 JDK 或某个库中?

另一方面,如果这样的类不存在并且我不应该自己创建一个类,我想听听为什么。

Hol*_*ger 5

Predicate创建实例以在后续语句中使用它们是没有意义的if

\n\n

Predicate实例通常用于将条件传递给方法。在这种情况下,您可以研究特定的 API,以了解使用自然构造是否可以实现这种链接。

\n\n

例如,当将Predicates 传递给流时,您可以简单地进行两个或多个filter调用:

\n\n
stringStream.filter(StringUtils::isAllUpperCase).filter(s->s.length()>5). \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

(并且您可以类似地Function使用多个map调用来链接 s)

\n\n

其他API可能也有类似的方法。

\n\n

但毕竟,如果您想要组合两个条件并且都不是实例Predicate,那么直接的解决方案就是组合表达式:

\n\n
stringStream.filter(s -> isAllUpperCase(s) && s.length()>5). \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

或作为独立创作:

\n\n
Predicate<String> allUpperCaseAndLongerThan5 = s -> isAllUpperCase(s) && s.length()>5;\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您可以在此处使用static importfor 实用程序方法,这允许更紧凑的表达式。

\n\n

仅当您已经拥有一个实例并想要增强其逻辑时,使用Predicate.andandPredicate.or才有用。但在这种情况下,您还有一个可以调用或没有问题Predicate的实例。andor

\n