四十五、Lambda

Lambda只能操作函数式接口

1、函数式接口

1.1 概述

只有一个抽象方法需要重写的接口,函数式接口。函数式接口是允许有其他的非抽象方法的存在例如静态方法,默认方法,私有方法。

为了标识接口是一个函数式接口,可以在接口之上加上一个注解: @FunctionalInterface 以示区别。

1.2 定义函数式接口:

@FunctionalInterface
public interface Swim {
    public abstract void swimming();
}

2、格式

2.1 匿名内部类中重写swim()方法的代码分析

  • 方法形式参数为空,说明调用方法时不需要传递参数
  • 方法返回值类型为void,说明方法执行没有结果返回
  • 方法体中内容,是我们具体要做的事情
goSwimming( new Swimming() {
    public void swim() {
        System.out.println("铁汁, 我们去游泳吧~");
    }
});

2.2 Lambda表达式的代码分析

  • () : 里面没有内容,可以看成是方法形式参数为空

  • -> : 用箭头执行后面要做的事情

  • {} :包含一段代码,我们称之为代码块,可以看成是方法体中的内容

goSwimming(() -> {
	System.out.println("铁汁, 我们去游泳吧~");
});

2.3 Lambda表达式格式

  • 格式 :( 形式参数 ) -> { 代码块 }

  • 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

  • ->:由英文中画线和大于符号组成,固定写法。代表指向动作

  • 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

2.4 Lambda表达式省略模式

  • 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
  • 如果参数有且有一个,那么小括号可以省略
  • 如果代码块的语句只有一条,可以省略大括号和分号,甚至return

3、有形参有返回值的Lambda

代码案例:

public class Demo07ComparatorLambda {
    public static void main(String[] args) {
        Person[] array = {
          	new Person("古力娜扎", 19),
          	new Person("迪丽热巴", 18),
          	new Person("马尔扎哈", 20) };

        Arrays.sort(array, (Person a, Person b) -> {
          	return a.getAge() - b.getAge();
        });

        for (Person person : array) {
            System.out.println(person);
        }
    }
}

4、Lambda表达式和匿名内部类的区别

4.1 所属类型不同

  • 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
  • Lambda表达式:只能是接口

4.2 使用限制不同

  • 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
  • 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

4.3 实现原理不同

  • 匿名内部类:编译之后,产生一个单独的.class字节码文件
  • Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
posted @ 2021-07-04 16:05  火烧云Z  阅读(36)  评论(0)    收藏  举报