应该直接调用功能接口吗?

时间:2018-01-23 02:32:58

标签: java functional-interface

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

当我将新实例传递到集合流时,这些工作非常有用,例如:

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

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

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

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

3 个答案:

答案 0 :(得分:3)

我也不会这样做。功能接口的乐趣在于您不必显式实现任何特定接口,也不必创建无用的对象。您所需要的只是一种能够达到您想要的效果的方法,您可以根据自己的功能将其弯曲。

静态定义谓词函数:

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

然后在如下的流中使用它:

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

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

boolean result = PrimeNumbers.isPrime(myData);

这样做的好处是可以自然地命名类和方法,而不是"谓词"或"测试"或者"申请"。

答案 1 :(得分:1)

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

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

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

boolean result = PrimeNumberCheck.test(myData);

答案 2 :(得分:0)

虽然调用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);