Ⅰ. 什么是 Lambda 表达式
Lambda 表达式是 JavaSE8 中一个重要的新特性,它允许通过表达式来代替功能接口。
Lambda 表达式和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(可以是一个表达式或一个代码块)。基本语法如下所示:
(parameters) -> expression
或者
(parameters) -> { statements; }举一些例子:
*// 1. 不需要参数,返回值为 2 *
() -> 2
*// 2. 接收⼀个参数,返回其2倍的值 *
x -> 2 * x
*// 3. 接受2个参数,并返回他们的和 *
(x, y) -> x + y
*// 4. 接收2个int型整数,返回他们的乘积 *
(int x, int y) -> x * y
*// 5. 接受⼀个 string 对象,并在控制台打印,不返回任何值*
(String s) -> System.out.print(s)函数式接口定义:一个接口,且其中只有一个抽象方法(可以包含普通方法) 。
注意:如果我们在某个接口上声明了
@FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。举个例子:
@FunctionalInterface interface NoParameterNoReturn { void test(); // 合法!可以有普通方法 default void test2() { System.out.println("JDK1.8新特性,default默认⽅法可以有具体的实现"); } }
Ⅱ. Lambda 表达式的使用
@FunctionalInterface
interface MyInterface1 {
void myMethod();
}
@FunctionalInterface
interface MyInterface2 {
int myMethod(int a, int b);
}
public class demo2 {
public static void main(String[] args) {
MyInterface1 myif1 = () -> System.*out*.println("无参无返回值方法");
myif1.myMethod();
MyInterface2 myif2 = (a, b) -> a + b;
System.*out*.println("有参数有返回值:" + myif2.myMethod(2, 3));
}
}☠ 注意事项:
-
参数类型可以省略。如果需要省略,每个参数的类型都要省略。
-
参数的小括号里面只有一个参数,那么小括号可以省略
-
如果方法体当中只有一句代码,那么大括号可以省略
-
如果方法体中只有一条语句,且是
return语句,那么大括号可以省略,且去掉return关键字。 -
lambda表达式捕获变量的规则,和匿名内部类是一样的 ,具体可以参考匿名内部类笔记 -
lambda表达式是 "函数式接口" 的一个匿名实现对象 ,区分开以下两者的区别:// Runnable是一个函数式接口,需要重写里面的run()方法! Runnable r = () -> System.out.println("Hello, Lambda!"); // Thread只是一个类,但是可以Thread(Runnable r)来构造,所以才需要new Thread,然后回到上面的问题! Thread t = new Thread(() -> System.out.println("work"));
列表排序的常用写法

1. 基本比较(数值)
Integer.compare(a, b)
安全的数值比较,避免溢出:
list.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));适用于:
-
int,double,long等基本类型 -
数值比较安全性优先(避免
a - b的溢出问题)
2. 方法引用 + Comparator.comparing
最简洁可读的写法:
list.sort(Comparator.comparing(Person::getAge));优点:
-
语义明确,别人一看就知道是按年龄排序
-
支持链式调用
.thenComparing(...)
3. 多条件排序
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
);场景:
-
先按主条件排(年龄)
-
如果相同,再按次条件(名字)
4. 倒序排序
两种常见方式:
// 方式1:reversed()
list.sort(Comparator.comparing(Person::getAge).reversed());
// 方式2:负数技巧(不推荐大数)
list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()));5. 处理 null 值
list.sort(
Comparator.comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))
);说明:
-
nullsFirst→ null 在最前面 -
nullsLast→ null 在最后面
6. 字符串比较(忽略大小写)
list.sort(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));7. 完全自定义规则
当规则复杂(比如特殊业务逻辑)时:
list.sort((p1, p2) -> {
if (p1.getAge() == p2.getAge()) {
return p1.getName().length() - p2.getName().length();
}
return p1.getAge() - p2.getAge();
});