java8(一)Lambda表达式
程序员文章站
2022-05-05 08:55:39
...
前言
Lambda的作用:简化函数式接口的使用 (@FunctionalInterface 接口中只能有一个抽象方法)。
Lambda表达式的基本语法: 参数列表 -> 表达式。
使用
下面让我们来对比一下使用和没使用Lambda表达式到差别。
后面代码要用到的基础类:
@[email protected]@ToString
public class User {
private String name;
private Integer score;
public User(String name, Integer score) {
this.name = name;
this.score = score;
}
}
没有使用Lambda前:
@Test
public void testOldUse1() {
User[] us = new User[]{new User("张三", 80),
new User("李四", 90),
new User("王五", 100)};
Arrays.sort(us, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getScore() - o2.getScore();
}
});
System.out.println(Arrays.toString(us));
}
使用Lamba后:
@Test
public void testNewUse1() {
User[] us = new User[]{new User("张三", 80),
new User("李四", 90),
new User("王五", 100)};
//进化1 : 不用写接口名和方法名,编译器会自动推导能够推导出来的东西
Arrays.sort(us, (User o1, User o2) -> {
return o1.getScore() - o2.getScore();
});
//进化2: 参数列表中的参数类型可以省略
Arrays.sort(us, (o1, o2) -> {
return o1.getScore() - o2.getScore();
});
//(特例:参数类型如果有final修饰,不能省略参数类型)
Arrays.sort(us, (final User o1, final User o2) -> {
return o1.getScore() - o2.getScore();
});
//进化3: 如果方法体只有一行代码,可以省略花括号, 如果有返回值,编译器会自动帮我们推导return
Arrays.sort(us, (o1, o2) -> o1.getScore() - o2.getScore());
//进化4: 方法引用
Integer[] is = new Integer[]{1, 3, 2, 4, 5, 8};
Arrays.sort(is, (x, y) -> Integer.compare(x, y));
//参数列表的值原原本本传递给方法体中的方法时,可以用方法引用的方式来书写
Arrays.sort(is, Integer::compare);
System.out.println("is = " + Arrays.toString(is));
//5.其他细节
//(不常用,了解即可)如果只有一个参数,并且写了参数类型,那么参数列表不可以省略括号
Arrays.stream(is).forEach((Integer x) -> System.out.println(x));
//如果只有一个参数,并且参数类型不写,那么参数列表可以省略括号
Arrays.stream(is).forEach(x -> System.out.println(x));
//更进一步
Arrays.stream(is).forEach(System.out::println);
System.out.println(Arrays.toString(us));
}
代码中详细描写了Lambda表达式的进化过程。建议把代码copy去自己的IDEA运行一下。