Lambda表达式
简介
Lambda是一个匿名函数(方法), 允许把函数作为一个方法的参数 。利用Lambda表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。一般都是优化匿名内部类
基础语法
无参数、无返回值的抽象方法
public class Test1 {
@Test
public void test01() {
// I1 i1 = new I1() {
// @Override
// public void method() {
// System.out.println("传统使用匿名内部类的方式");
// }
// };
// i1.method();
I1 i1 = ()-> System.out.println("采用Lambda表达式的方式");
i1.method();
}
}
interface I1{
public void method();//无参数、无返回值的抽象方法
}
一个参数、无返回值的抽象方法
public class Test1 {
@Test
public void test01() {
I1 i1 = (x)-> System.out.println("采用Lambda表达式的方式 " + x);
i1.method(1000);
}
}
interface I1{
public void method(int num1);//一个参数、无返回值的抽象方法
}
多个参数、无返回值的抽象方法
public class Test1 {
@Test
public void test01() {
I1 i1 = (x,y,z)->
System.out.println("采用Lambda表达式的方式 " + x + y + z);
i1.method(1000,2000,3000);
}
}
interface I1{
//多个参数、无返回值的抽象方法
public void method(int num1,int num2,int num3);
}
多个参数、有返回值的抽象方法
public class Test1 {
@Test
public void test01() {
I1 i1 = (x,y,z)-> x+y+z;
int result = i1.method(1000,2000,3000);
System.out.println(result);
}
}
interface I1{
//多个参数、有返回值的抽象方法
public int method(int num1,int num2,int num3);
}
注意点
- 重写方法的形参只有一个时,可以不加小括号
- Lambda表达式当中不允许声明一个与局部变量同名的参数或者局部变量
- Lambda表达式中访问外层的局部变量,外层的局部变量自动变成隐式常量,默认添加final
- 重写方法的形参同时加类型或同时不加类型
public class Test1 {
@Test
public void test01() {
int x;
int num = 10;
I1 i1 = x -> System.out.println(x + (num++));
i1.method(1000);
I2 i2 = (int x,int y) -> {
int result = x+y;
return result;
};
int result = i2.method(10, 20);
System.out.println(result);
}
}
interface I1{
public void method(int num1);
}
interface I2{
public int method(int num1,int num2);
}
练习
- 调用Collections.sort()方法,通过定制排序比较两个Student对象(先按年龄比较,年龄相同按照薪资比较),使用Lambda表达式作为参数传递
public class Test1 {
@Test
public void test01() {
List<Student> stuList = Arrays.asList(
new Student("张三", 28, 4800,Course.JAVA),new Student("李四", 36, 7200,Course.JAVA),new Student("王五", 19, 9600,Course.HTML),new Student("赵六", 42, 6100,Course.HTML),new Student("孙七", 23, 9600,Course.PYTHON),new Student("吴八", 31, 3000,Course.PYTHON));
Collections.sort(stuList, (a,b)-> {
if(a.getAge() == b.getAge()){
return Double.compare(a.getSalary(),b.getSalary());
}
return a.getAge()-b.getAge();
});
for (Student stu : stuList) {
System.out.println(stu);
}
}
}
enum Course{//课程枚举
JAVA,HTML,PYTHON;
}
class Student{//学生类
private String name;
private int age;
private double salary;
private Course course;
...
}
- 创建I1接口,创建抽象方法:public String getValue(String str),在测试类中编写方法使用接口作为参数,将一个字符串转为大写,并作为方法的返回值
public class Test1 {
@Test
public void test01() {
String strHandler = strHandler("abc", x-> x.toUpperCase());
System.out.println(strHandler);
}
public static String strHandler(String str,I1 i1){
return i1.getValue(str);
}
}
interface I1{
public String getValue(String str);
}
- 创建I1<T,R>接口,泛型T为参数,R为返回值,创建抽象方法:public R add(T t1,T t2),在测试类中编写方法使用接口作为参数,计算两个long类型的和
public class Test1 {
@Test
public void test01() {
Long addLong = addLong(100L, 200L, (x,y)-> x+y);
System.out.println(addLong);
}
public static Long addLong(Long l1,Long l2,I1<Long,Long> i1){
return i1.add(l1, l2);
}
}
interface I1<T,R>{
public R add(T t1,T t2);
}