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)代码>,但是,消费者创建和执行之间的差异不是很明显,但是对于这个用例来说也不是那么相关。一般来说,您可以让消费者
比单个用例保持更长的时间