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注解来编辑这个接口。

  • 它可以限制接口中只能由一个方法
  • 它还可以说明是一个函数式接口
posted @ 2022-05-27 17:35  破忒头头  阅读(43)  评论(0)    收藏  举报