Java核心技术-方法引用
Day6
方法引用
可以将一个方法引用传递给一个函数式接口。
System.out::println//就是一个函数引用,它指示编译器生成一个函数式接口的实例,覆盖这个接口的抽象方法来调用给定的方法
只有再lambda表达式的体只调用一个方法而不做其他操作时,才能把lambda表达式重写为方法引用。
s->s.length()==0
这里有一个方法调用,但是后面还有一个比较所以不能用方法引用。
类似于lambda表达式,方法引用不能独立存在,总是会转换为函数式接口的实例。
list.removeIf(Object::isNull);
//相当于 list.removeIf(e->e==null);
可以在方法引用中使用this,super参数。
class Greeter{
public void greet(ActionEvent event){
System.out.println("Hello,the time is "+Instant.ofEpochMilli(event.getWhen()));
}
}
class RepeatedGreeter extends Greeter{
public void greet(ActionEvent event){
var timer = new Timer(1000,super::greet);
timer.start();
}
}
RepeatedGreeter.greet方法开始执行时,会构造一个Timer,每次定时七滴答时会执行super.greet方法。
lambda表达式表达的是函数式接口的被复写的方法体的内容。
lambda表达式捕获的变量必须实际上是事实最终变量
使用lambda的重点就是延迟执行
因为如果想要直接执行,完全可以直接编写程序执行,无效把他包装在一个lambda表达式中。
延迟执行的原因有很多种:
- 在一个单独的线程中运行代码
- 多次运行代码
- 在算法的适当位置运行代码(例如,排序中的比较操作)
- 发生某种情况时执行代码(如点击了一个按钮,数据到达,等等)
- 只在必要时才运行的代码
例如假设想重复一个动作n次。将这个动作和重复次数传递到一个repeat方法中。
/**
* 调用action.run()方法是会执行这个lambda代码块的主体🐖
* @author xg
* @version V1.0
* @date 2022/5/27 16:59
*/
public class LambdaDemo {
public static void repeat(int n,Runnable action){
for (int i = 0; i < n; i++) {
action.run();
}
}
public static void main(String[] args) {
repeat(10,()-> System.out.println("🤭"));//可传递代码块
}
}
加强版repeat
import java.util.function.IntConsumer;
/**
* @author xg
* @version V1.0
* @date 2022/5/27 16:59
*/
public class LambdaDemo {
public static void repeat(int n, IntConsumer action){
for (int i = 0; i < n; i++) {
action.accept(i);
}
}
public static void main(String[] args) {
repeat(10,(int i)-> System.out.println(i));
}
}
自己设计函数是接口的时候需要添加一个@FunctionalInterface注解来编辑这个接口。
- 它可以限制接口中只能由一个方法
- 它还可以说明是一个函数式接口
浙公网安备 33010602011771号