Lambda 引用而不执行

Lambda 引用而不执行,lambda,java-8,method-reference,Lambda,Java 8,Method Reference,根据这一点,方法引用被定义为一个未被执行而被引用的方法或构造函数,有人能解释这是怎么可能的吗 例如: public void main String(args[]) { List<Integer> numbers = Arrays.asList(1, 2, 3); // Below is a method reference that is referenced and being executed on run (prints the numbers!!)

根据这一点,方法引用被定义为一个未被执行而被引用的方法或构造函数,有人能解释这是怎么可能的吗

例如:

public void main String(args[]) {
     List<Integer> numbers = Arrays.asList(1, 2, 3);
     // Below is a method reference that is referenced and being executed on run (prints the numbers!!)
     numbers.forEach(System.out::println);
}
public void主字符串(args[]{
列表编号=数组.asList(1,2,3);
//下面是一个在运行时被引用和执行的方法引用(打印数字!!)
forEach(System.out::println);
}

如果有人能解释“引用而不执行”语句的含义,我们将不胜感激:)

当您调用
numbers.forEach(System.out::println)
时,您引用
System.out::println
方法,但不执行它。例如,如果
numbers
列表为空,则永远不会执行此方法。另一方面,有了此方法引用,
forEach
方法可以在内部调用此引用任意次数(在本例中:对于每个列表元素)

当您使用等效的匿名类重写此代码时,可能更容易理解:

 numbers.forEach(new Consumer<Integer>() {
     public void accept(Integer num) {
         System.out.println(num);
     }
 });
numbers.forEach(新消费者(){
公共void接受(整数num){
系统输出打印项数(num);
}
});

在这里,您可以看到方法引用实际上是创建
Consumer
类型的helper对象,而不是实际调用所引用的方法。

当您调用
numbers.forEach(System.out::println)
时,您引用
System.out::println
方法,但不执行它。例如,如果
numbers
列表为空,则永远不会执行此方法。另一方面,有了此方法引用,
forEach
方法可以在内部调用此引用任意次数(在本例中:对于每个列表元素)

当您使用等效的匿名类重写此代码时,可能更容易理解:

 numbers.forEach(new Consumer<Integer>() {
     public void accept(Integer num) {
         System.out.println(num);
     }
 });
numbers.forEach(新消费者(){
公共void接受(整数num){
系统输出打印项数(num);
}
});

在这里,您可以看到方法引用实际上是创建
Consumer
类型的helper对象,而不实际调用引用的方法。

您的语句
numbers.forEach(System.out::println)是的内联版本

Consumer<Integer> c=System.out::println;
numbers.forEach(c);
consumerc=System.out::println;
数字。forEach(c);
这应该更好地说明,第一行创建了对
PrintWriter
实例的方法
println
的引用,该实例位于
System.out
中,并且没有执行它。它不打印任何东西,甚至不知道打印什么。要打印的对象是已创建的
使用者的方法的参数

第二行
numbers.forEach(c)
最终将打印每个数字,因为指定的
Consumer
已创建为参考
System.out::println
forEach
方法接收一个任意的
Consumer
,并将通过调用每个元素的所述
accept
方法对每个元素执行其封装操作,并将元素作为参数传递


当然,您可以内联变量
c
以获取原始语句
numbers.forEach(System.out::println),但是,消费者创建和执行之间的差异不是很明显,但是对于这个用例来说也不是那么相关。一般来说,您可以将
消费者
保留的时间比单个用例长得多。

您的语句
numbers.forEach(System.out::println)是的内联版本

Consumer<Integer> c=System.out::println;
numbers.forEach(c);
consumerc=System.out::println;
数字。forEach(c);
这应该更好地说明,第一行创建了对
PrintWriter
实例的方法
println
的引用,该实例位于
System.out
中,并且没有执行它。它不打印任何东西,甚至不知道打印什么。要打印的对象是已创建的
使用者的方法的参数

第二行
numbers.forEach(c)
最终将打印每个数字,因为指定的
Consumer
已创建为参考
System.out::println
forEach
方法接收一个任意的
Consumer
,并将通过调用每个元素的所述
accept
方法对每个元素执行其封装操作,并将元素作为参数传递

当然,您可以内联变量
c
以获取原始语句
numbers.forEach(System.out::println),但是,消费者创建和执行之间的差异不是很明显,但是对于这个用例来说也不是那么相关。一般来说,您可以让
消费者
比单个用例保持更长的时间