用于引导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.and
和Predicate.or
仅在您已经拥有Predicate
实例并且想要扩充其逻辑时才有用。 但在这种情况下,您还有一个可以调用的实例and
或者or
没有问题。