一、Lambda表达式
1、基本语法
lambda表达式可以理解为一段带有输入参数的可执行语句块,这种语法表达方式也可以成为函数式表达
(type1 param1, type1 param2,...) -> {
// 方法执行的代码段;
}
package com.huawei.lambda表达式;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
// 练习参考 https://www.cnblogs.com/JunkingBoy/p/15050206.html
public class LambdaTest01 {
public static void main(String[] args) {
List<Student> students = Arrays.asList(new Student("张三", 18),
new Student("李四", 25),
new Student("王五", 37),
new Student("赵四", 25));
testLambda(students);
// lamda表达式
//students.forEach(student -> System.out.println(student));
/*students.forEach(System.out::println);
System.out.println("========排序后的结果=========");
// 利用lambda表达式进行元素排序,按照年龄进行降序排列,年龄相同比较姓名
Collections.sort(students, (x,y) -> {
if (x.age == y.age) {
return y.name.compareTo(x.name);
}
return y.age - x.age;
});
students.forEach(System.out::println);*/
}
static void testLambda(List<Student> students) {
// 传统的方式
System.out.println("====传统方式====");
for (int i = 0; i < students.size(); i++) {
System.out.println(students.get(i));
}
System.out.println("===lambda标准形式===");
// lambda表达式: 2.1 参数类型可移省略
students.forEach((student) -> {
System.out.println(student);
});
System.out.println("===lambda简化形式1===");
//2.2 当lambda表达式的参数个数只有一个时,可移省略大括号、语句结尾的分号。
students.forEach(student -> System.out.println(student));
System.out.println("===lambda简化形式2===");
// 函数式表达
students.forEach(System.out::println);
}
}
class Student {
String name;
int age;
Student() {
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name: " + name + ", age: " + age;
}
}
2 lambda表达式的简化形式
2.1 参数类型可移省略
绝大多数情况下,编译器都可以从上下文环境中推断出lambda表达式的参数类型。因此,lambda表达式可移省略参数类型
3 lambda表达式的用途
package com.huawei.stream流;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class StreamTest02 {
public static void main(String[] args) {
List<Student> students = new ArrayList<Student>() {
{
// 匿名内部类添加对象 问题:此处怎么转换为lanbda表达式来创建对象list
add(new Student("张三疯", 18));
add(new Student("翠花", 22));
add(new Student("李财", 5));
add(new Student("李柏松", 28));
}
};
// 测试:对students集合进行过滤,过滤条件时姓名字符串的长度大于3,接着按照姓名排序,再把集合中的studen信息打印出来
students.stream()
.filter(student -> student.getName().length() > 2)
.sorted((s1, s2) -> s1.name.compareTo(s2.name))
.limit(3)
.forEach(System.out::println);
}
}
class Student {
String name;
int age;
Student() {
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name: " + name + ", age: " + age;
}
}