二、Lambda表达式

JDK8之后,java支持了lambda表达式这个特性.

lambda可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!

lambda表达式是编译器认可的,最终会将其改为内部类编译到class文件中

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package lambda;

import java.io.File;
import java.io.FileFilter;

/**
* @author 老安
* @data 2022/7/1 20:58
* JDK8之后推出了一个新的特性:lambda表达式
* lambda表达式可以用更精简的方式创建匿名内部类
* 语法:
* (参数列表)->{
* 方法体
* }
* 不是所有的匿名内部类创建的情景都可以替换为lambda表达式,只有实现的接口内部只能有一个抽象方法时,才可以使用lambda表达式
*/
public class LambdaDemo {
   public static void main(String[] args) {
       //匿名内部类
       FileFilter filter = new FileFilter() {
           @Override
           public boolean accept(File pathname) {
               return pathname.getName().contains("o");
          }
      };
       //可以忽略接口名(new FileFilter)和方法名(public boolean accept(){})
       //将方法的参数声明放在接口括号中,然后用->符号连接{}
       //忽略接口名:因为声明时FileFilter filter1,已经表明要实例化的对象了
       //忽略方法名:因为lambda表达式支持的接口只允许有一个抽象方法
       FileFilter filter1 = (File pathname) -> {
           return pathname.getName().contains("o");
      };
       //可以忽略参数类型(File)
       //因为只有一个方法,方法的参数顺序已经固定,所以参数无序表明类型
       FileFilter filter2 = (pathname) -> {
           return pathname.getName().contains("o");
      };
       //如果方法只有一个参数时,()可以省略
       FileFilter filter3 = pathname -> {
           return pathname.getName().contains("o");
      };
       //如果方法体只有一句代码时,那么可以将方法体的"{}"省略,如果含有return,则return要一同忽略
       FileFilter filter4 = pathname -> pathname.getName().contains("o");
       File file = new File(".");
       File[] files = file.listFiles(pathname -> pathname.getName().contains("o"));
       for (int i = 0; i < files.length; i++) {
           System.out.println(files[i]);
      }
  }
}