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

通过Java 8中引入的function接口,您可以轻松地将不同的表达式链接到一个新表达式中,如下面的代码片段所示。

public class PredicateChaining { public static void main(String[] args) { // verbose, but standard JDK functionality only Predicate allUpperCase = StringUtils::isAllUpperCase; Predicate 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  Predicate chain(Predicate test) { return test; } } 

在这种情况下,2个字符串谓词被链接成一个新的谓词 。 当你有至少一个句柄(即变量)来调用链接方法(在本例中为’ ‘)时,这很好。 但是,如果要链接的表达式表示为lambda或方法引用,则需要将其中一个显式转换为变量,这使得它非常详细。 当编译器无法确定确切的类型时,您必须采用这种结构。 但在大多数情况下,这只是我想避免的冗长开销。

在这个例子中,我自己写了实用方法’ chain ‘。 但我也可以为其他function接口( function消费者供应商BiConsumer ,……)创建一个。

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

另一方面,如果这样的课程不存在而且我不应该自己创作,我想听听为什么。

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

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

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

 stringStream.filter(StringUtils::isAllUpperCase).filter(s->s.length()>5). … 

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

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

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

 stringStream.filter(s -> isAllUpperCase(s) && s.length()>5). … 

或作为独立创作:

 Predicate allUpperCaseAndLongerThan5 = s -> isAllUpperCase(s) && s.length()>5; 

请注意,您可以在此处使用实用方法的static import ,这样可以实现更紧凑的表达式。

使用Predicate.andPredicate.or仅在您已经拥有Predicate实例并且想要扩充其逻辑时才有用。 但在这种情况下,您还有一个可以调用的实例and或者or没有问题。