文章目录

定义

Lambda基于数学中的λ演算得名,实质上是一种语法糖。由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

标准格式

Lambda表达式由三部分组成:

  • 1、一些参数:parameters
  • 2、一个箭头:->
  • 3、一段代码: expression / { statements; }

(parameters) -> expression

(parameters) ->{ statements; }

无参数无返回值
/**
* 无参数无返回值--lambda表达式创建新线程输出线程名
*/
public class Demo1 {
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}
).start();
}
}
有参数有返回值
/**
* lambda有参数有返回值例子
*
* @author zhuhuix
* @date 2020-05-24
*/
public class Person {
//姓名
private String name;
//年龄
private int age;

public Person(){}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* lambda有参数有返回值例子
*
* @author zhuhuix
* @date 2020-05-24
*/
public class PersonArrays {

public static void main(String[] args) {
//创建Person数组
Person[] personArray = {
new Person("Mike", 20),
new Person("Jack", 21),
new Person("Rose", 19)
};

//使用lambda表达式对数组中的Person对象按年龄升序排序
Arrays.sort(personArray, (Person p1, Person p2) -> {
return p1.getAge() - p2.getAge();
});

//遍历Person数组
for (int i = 0; i < personArray.length; i++) {
System.out.println(personArray[i].toString());
}

}

}
优化省略

1.小括号中参数列表的数据类型,可以省略不写
2.小括号中的参数如果只有一个,那么类型和小括号都可以省略
3.如果大括号中的代码只有一行,无论是否有返回值,都可以省略大括号,return及分号(要省略则三个必须同时省略)

// 优化省略前的代码
Arrays.sort(personArray, (Person p1, Person p2) -> {
return p1.getAge() - p2.getAge();
});

// 优化省略后的代码
Arrays.sort(personArray, (Person p1, Person p2) -> p1.getAge() - p2.getAge());

使用前提

1、使用lambda必须具有接口,且要求接口中有且仅有一个抽象方法(有且仅有一个抽象方法的接口,称为函数式接口)。
无论是jdk内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用lambda.

2、使用lambda必须具有上下文推断。
也就是说方法的参数或局部变量类型必须为lambda对应的接口类型,才能使用lambda作为该接口的实例。