Java Lambda表达式 与 函数式接口

JDK8中增加了一个特性Lambda表达式, 这种表达式只针对有一个抽象方法的接口实现, 以简单的表达式形式实现接口功能来作为方法参数.

三个组成部分

参数列表
->
表达式主体

语法格式

([数据类型 参数名, 数据类型 参数名,...])->{
    
    表达式主体}

具体说明

  1. 参数列表里的参数类型可以省略参数的数据类型, 若只有一个参数, 则可以省略括号()
  2. ->: 表示Lambda 表达式箭牌, 用来指定参数数据的指向, 不能省略
  3. 若表达式主体只有一条语句,则可以省略大括号
  4. Lambda表达式主体允许有返回值, 当只有一条return语句时, 也可以省略return关键字.
public class Demo {
    
    
    public static void main(String[] args) throws MyException {
    
    
        int calc = calc(10, 10, (x, y) -> x + y);
        System.out.println(calc);
    }
    private static int calc(int x, int y, Callable callable){
    
    
        return callable.call(x, y);
    }
}
interface Callable{
    
    
    int call(int a, int b);
}

函数式接口 是指有且仅有一个抽象方法的接口,Lambda表达式就是Java函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambd表达式才能顺利的推导出所实现的接口中的方法.
JDK8中,专门为函数接口引入了一个@FunctionalInterface 注解,该注解显示地标注了接口是一个函数式接口,并强制编译器进行更严格地检查.

@FunctionalInterface
interface Callable{
    
    
    int call(int a, int b);
}

方法引用和构造器引用,进一步简化Lambda表达式的书写

List<Integer> list = new LinkedList<>();
list.add(1);
list.add(4);
list.add(0);
list.forEach(System.out::println);

Thread thread = new Thread(() -> {
    
    
    System.out.println(Thread.currentThread().getName());
},"thread1");
thread.start();

猜你喜欢

转载自blog.csdn.net/weixin_45867397/article/details/118279094