函数式接口应该直接调用吗?

Should functional interfaces be called directly?

我构建了一些 类 实现功能接口以便它们可以重用,其中包括谓词、函数等。

当我将新实例传递到集合流中时,它们非常有用,例如:

myList.stream().filter(new PrimeNumberPredicate())...

今天通过直接创建和调用谓词找到了谓词的用法:

boolean result = new PrimeNumberPredicate().test(myData);

我觉得这段代码有点冗长,我想问一下是否有另一种写法,这样我就可以在不显式调用单个对象上的 test() 的情况下进行测试。

作为替代方法,您可以将 test 声明为静态方法,并在需要实际 Predicate 时使用方法引用:

public class PrimeNumberCheck {
   public static boolean test(BigInteger n) {...}
}

myList.stream().filter(PrimeNumberCheck::test)

boolean result = PrimeNumberCheck.test(myData);

虽然调用 test 没有任何问题,但您可以使用使用流的同样冗长的方法:

boolean result = Stream.of(myData).anyMatch(new PrimeNumberPredicate());

您也可以创建 PrimeNumberPredicate 的单个实例,然后重用它而不是一直创建 new

class PrimeNumberPredicate {
    public static final PrimeNumberPredicate Instance = new PrimeNumberPredicate();
    ...
}

现在调用看起来像这样:

boolean result = Stream.of(myData).anyMatch(PrimeNumberPredicate.Instance);

我也不会。函数式接口的乐趣在于您不必显式地实现任何特定的接口,也不必创建无用的对象。您所需要的只是一种可以满足您的需求的方法,您可以根据自己的意愿调整它。

静态定义谓词函数:

class PrimeNumbers {
    public static boolean isPrime(int number) {
        ...
    }
}

然后像这样在流中使用它:

myList.stream().filter(PrimeNumbers::isPrime)...

像您同事的非功能代码可以跳过实例化对象并直接调用函数:

boolean result = PrimeNumbers.isPrime(myData);

这样做的好处是可以让您自然地命名 class 和方法,而不是 "predicate" 或 "test" 或 "apply"。