方法引用如何与具有不同实现函数名称的功能接口兼容?
How is a Method reference compatible with functional interface with different implementing function names?
在这里,对静态方法 isPrime( ) 的引用作为第一个参数传递给 numTest( )。
这是可行的,因为 isPrime 与 IntPredicate 功能接口兼容。因此,
表达式 MyIntPredicates::isPrime 计算为对对象的引用,其中
isPrime( ) 在 IntPredicate 中提供了 test( ) 的实现。
如何 can/does isPrime() 提供 test() 使用不同于 test() 的 reference/name 的实现。 我猜这是在 Java 8 中执行此操作提供了更多的灵活性和可能性。有人可以解释这是否是新的吗?它是如何工作的?
谢谢!
//Demonstrate a method reference for a static method.
//A functional interface for numeric predicates that operate
//on integer values.
interface IntPredicate {
//the abstact to be implemented with something compatible
boolean test(int n);
}
// This class defines three static methods that check an integer
// against some condition.
class MyIntPredicates {
// A static method that returns true if a number is prime.
static boolean isPrime(int n) {
if (n < 2)
return false;
for (int i = 2; i <= n / i; i++) {
if ((n % i) == 0)
return false;
}
return true;
}
// A static method that returns true if a number is even.
static boolean isEven(int n) {
return (n % 2) == 0;
}
// A static method that returns true if a number is positive.
static boolean isPositive(int n) {
return n > 0;
}
}
public class MethodRefDemo {
// This method has a functional interface as the type of its
// first parameter. Thus, it can be passed a reference to any
// instance of that interface, including one created by a
// method reference.
static boolean numTest(IntPredicate p, int v) {
return p.test(v);
}
public static void main(String args[]) {
boolean result;
// Here, a method reference to isPrime is passed to numTest().
result = numTest(MyIntPredicates::isPrime, 17);
if (result)
System.out.println("17 is prime.");
// Next, a method reference to isEven is used.
result = numTest(MyIntPredicates::isEven, 12);
if (result)
System.out.println("12 is even.");
// Now, a method reference to isPositive is passed.
result = numTest(MyIntPredicates::isPositive, 11);
if (result)
System.out.println("11 is positive.");
}
}
这是工作中的 lambda 示例。它是 java 8 中的新功能,它基本上允许运行时使用您定义的实现为您创建功能接口的实例。
Brian Goetz 写了一篇 doc 关于 lambda(和方法引用)在编译和运行时如何工作的文章。
在这里,对静态方法 isPrime( ) 的引用作为第一个参数传递给 numTest( )。 这是可行的,因为 isPrime 与 IntPredicate 功能接口兼容。因此, 表达式 MyIntPredicates::isPrime 计算为对对象的引用,其中 isPrime( ) 在 IntPredicate 中提供了 test( ) 的实现。
如何 can/does isPrime() 提供 test() 使用不同于 test() 的 reference/name 的实现。 我猜这是在 Java 8 中执行此操作提供了更多的灵活性和可能性。有人可以解释这是否是新的吗?它是如何工作的?
谢谢!
//Demonstrate a method reference for a static method.
//A functional interface for numeric predicates that operate
//on integer values.
interface IntPredicate {
//the abstact to be implemented with something compatible
boolean test(int n);
}
// This class defines three static methods that check an integer
// against some condition.
class MyIntPredicates {
// A static method that returns true if a number is prime.
static boolean isPrime(int n) {
if (n < 2)
return false;
for (int i = 2; i <= n / i; i++) {
if ((n % i) == 0)
return false;
}
return true;
}
// A static method that returns true if a number is even.
static boolean isEven(int n) {
return (n % 2) == 0;
}
// A static method that returns true if a number is positive.
static boolean isPositive(int n) {
return n > 0;
}
}
public class MethodRefDemo {
// This method has a functional interface as the type of its
// first parameter. Thus, it can be passed a reference to any
// instance of that interface, including one created by a
// method reference.
static boolean numTest(IntPredicate p, int v) {
return p.test(v);
}
public static void main(String args[]) {
boolean result;
// Here, a method reference to isPrime is passed to numTest().
result = numTest(MyIntPredicates::isPrime, 17);
if (result)
System.out.println("17 is prime.");
// Next, a method reference to isEven is used.
result = numTest(MyIntPredicates::isEven, 12);
if (result)
System.out.println("12 is even.");
// Now, a method reference to isPositive is passed.
result = numTest(MyIntPredicates::isPositive, 11);
if (result)
System.out.println("11 is positive.");
}
}
这是工作中的 lambda 示例。它是 java 8 中的新功能,它基本上允许运行时使用您定义的实现为您创建功能接口的实例。
Brian Goetz 写了一篇 doc 关于 lambda(和方法引用)在编译和运行时如何工作的文章。