java中的Lambda表达式是Java 8引入的一个重要特性,它提供了一种清晰且简洁的方式来表示单个方法的接口(也被称为函数式接口)的实例。Lambda表达式使得编写匿名内部类(尤其是那些仅实现了一个方法的接口)变得更加简洁和易于理解。
基本语法
Lambda表达式的基本语法如下:
(parameters) -> expression
或者对于包含多条语句的情况:
(parameters) -> { statements; }
- parameters:参数列表。参数的类型可以省略(称为类型推断),但如果有多个参数,则必须用小括号括起来。
- ->:Lambda操作符,将参数列表与Lambda体分隔开。
- expression/statements:Lambda体,可以是单个表达式(该表达式的计算结果会自动返回),也可以是一个代码块(需要显式地使用
return
语句返回结果,如果方法签名指定了返回类型的话)。
public class Demo01Lambda {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我执行了");
}
}).start();
System.out.println("============");
new Thread(()-> System.out.println("我执行了")).start();
ArrayList<String> list = new ArrayList<>();
}
}
Lambda表达式的编写步骤
- 识别函数式接口:首先,观察是否有函数式接口作为方法的参数进行传递。函数式接口是只包含一个抽象方法的接口(可以使用
@FunctionalInterface
注解进行标记,但这不是强制的)。 - 考虑使用Lambda表达式:如果确认参数是函数式接口,那么可以考虑使用Lambda表达式来简化代码。Lambda表达式提供了一种简洁的方式来实现这个接口。
- 转换匿名内部类:原本可能需要通过匿名内部类来传递实参给方法,现在可以使用Lambda表达式来替代。首先,定位到匿名内部类的声明处(从
new 接口名()
开始到重写的方法体结束)。 - 删除不必要的部分:选中整个匿名内部类的代码块,除了重写的方法体内容外,删除
new 接口名()
、接口名、方法名后的括号、以及方法的返回类型声明(如果Lambda表达式能够通过上下文推断出返回类型)。不要忘记最后删除一个多余的右大括号。 - 添加Lambda操作符:在保留的参数列表和方法体之间,插入Lambda操作符
->
。这标志着Lambda表达式的开始。
Lambda表达式的省略规则(优化表述)
- 参数类型省略:在Lambda表达式中,如果编译器能够根据上下文推断出参数的类型,那么可以省略参数的类型声明。
- 单参数小括号省略:如果Lambda表达式只接受一个参数,那么包围该参数的小括号可以省略,但参数名仍需保留。
- 单语句大括号和分号省略:如果Lambda表达式的方法体只包含一条语句,那么可以省略方法体的大括号和分号。此时,如果这条语句是一个表达式,其值将作为Lambda表达式的返回值。
- 返回值省略:如果Lambda表达式的方法体只有一条返回语句,并且该语句的返回值类型与Lambda表达式声明的返回类型兼容,那么可以省略
return
关键字以及该语句后的分号。Lambda表达式将自动返回该表达式的值。
案列
定义一个类
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
定义实现类 , 写 Lambda表达式
public class Demo03Lambda {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",10));
list.add(new Person("李四",8));
list.add(new Person("王五",9));
/* Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
*/
System.out.println("=============Lambda==========");
/* Collections.sort(list,(Person o1, Person o2)-> {
return o1.getAge()-o2.getAge();
});*/
System.out.println("===========Lambda表达式简化形式==========");
Collections.sort(list,(o1, o2)-> o1.getAge()-o2.getAge());
System.out.println(list);
}
}
标签:java,name,--,Person,new,public,表达式,Lambda
From: https://blog.csdn.net/xiugtt6141121/article/details/140830095