这个不必要的方法参考背后的想法是什么?

Fir*_*ien 2 java methods predicate java-8

java 8中的Predicate接口有一个静态方法,如:

static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
}
Run Code Online (Sandbox Code Playgroud)

为什么不这样做:

 return (null == targetRef) 
            ? null
            : object -> targetRef.equals(object);
Run Code Online (Sandbox Code Playgroud)

我的意思是,这个方法参考Objects::isNull没有带来任何进一步的改进......并且正在减少一点可读性......

if为null我返回true ...完成!或者我在幕后错过了一些陷阱......?

Swe*_*per 8

该方法需要返回一个Predicate<T>.尽管null 有效值Predicate<T>,但在这种情况下它并不是真正有用.

如果传入的对象为null,我们如何确定其他东西是否等于它?好吧,我们检查"其他东西"是否也是空的!代码可能是:

object -> object == null
Run Code Online (Sandbox Code Playgroud)

看看这是一个lambda表达式,而不是null文字?如果你想说"检查某些东西是否为空"你应该写一个像这样的lambda表达式,而不是null.

Objects::isNull方法与上述lambda大致相同.他们选择了Objects::isNull因为它更具可读性.

编辑:我看到你编辑你的问题,改变nulltrue.这也不正确.

首先,true它不是有效值Predicate<T>.如果你想要一个总是返回true的谓词,你需要

obj -> true
Run Code Online (Sandbox Code Playgroud)

无论如何,这在逻辑上也是不正确的.null对象并不总是等于另一个对象.

  • 我想`(null == targetRef)?Objects :: isNull:targetRef :: equals`会更具可读性 (3认同)

小智 5

我认为这里的误解是不测试targetRef为null,但是这个方法返回一个测试相等性的Predicate(一个函数).

所以这样的代码可以写成:

Predicate<String> writtenByAuthor = Predicate.isEqual("Firewall-Alien");
Run Code Online (Sandbox Code Playgroud)

该实例可以在使用谓词的其他方法中使用,例如java.util.stream.Stream.filter(Predicate<? super T> p).

回到你的问题null可能这个片段说明了用法:

void printMatching(List<String> list, String s) {
   printMatching(list, Predicate.isEqual(s));
}

void printMatching(List<String> list, Predicate<? super String> filter) {
   Objects.requireNonNull(list);
   Objects.requireNonNull(filter);
   list.stream().filter(filter).forEach(System.out::println);
}   
Run Code Online (Sandbox Code Playgroud)

现在看看这个代码,无论snull与否,对平等谓语测试构造测试所提供的列表中的每个元素,并将其打印出来.此代码还表明,如果您需要一些灵活性,谓词和功能接口是您的朋友.如果您的项目不需要这种灵活性,您可以安全地决定不使用它们并使用众所周知的方法来测试您的参数.