Lambda表达式

lambda表达式通俗的讲可以理解为匿名函数,它没有访问修饰符、返回值以及声明方法。它只能用于函数式接口

函数式接口

只包含一个抽象方法的接口。在判断是否为函数式接口的时候要排除Object里面的方法,如toString这些。

java中的函数式接口都在java.util.function中。可以自定义函数式接口使用lambda,在自定义的时候在接口上加上@FunctionalInterface 注解,该注解由编译器检查。因此,如果该接口不是仅仅只包含一个抽象方法,那么就会出现编译错误。

1
2
3
4
5
6
7
8
9
10
11
//这是函数式接口
@FunctionalInterface
interface eat{
void eatFood();
}
//这个也是函数式接口
@FunctionalInterface
interface eat{
void eatFood();
String toString();
}

主要特性

  1. 一个参数无需圆括号,多个参数需要圆括号,没有参数需要圆括号

  2. 无需声明参数类型,编译器自动识别

  3. 如果主体只有一个语句,不需要大括号

  4. 如果主体只有一个返回值,不需要return就自动返回

    1
    2
    3
    e -> e*2;
    (e1,e2) -> e1+e2;
    () -> 5
  5. lambda内部可以访问外部的静态、非静态和局部变量

  6. lambda只能引用final标记的变量,也就是不能在lambda内部修改定义在域外的变量

  7. 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量

    1
    2
    String first = "";  
    Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错

Lambda常用的地方

Runnable

1
new Thread( () -> System.out.println("Lambda expression") ).start();

ActionListener

1
2
3
4
JButton show =  new JButton("Show");
show.addActionListener((e) -> {
System.out.println("Lambda expressions");
});

集合遍历

1
2
List features = Arrays.asList("Lambdas", "Method", "API", "Date");
features.forEach(n -> System.out.println(n));
-------- ♥感谢阅读♥ --------