函数式接口应该直接调用吗?
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"。
我构建了一些 类 实现功能接口以便它们可以重用,其中包括谓词、函数等。
当我将新实例传递到集合流中时,它们非常有用,例如:
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"。