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"));
Integer.compare(a, b)安全的数值比较,避免溢出:
list.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));适用于:
int, double, long 等基本类型a - b 的溢出问题)Comparator.comparing最简洁可读的写法:
list.sort(Comparator.comparing(Person::getAge));优点:
.thenComparing(...)list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
);场景:
两种常见方式:
// 方式1:reversed()
list.sort(Comparator.comparing(Person::getAge).reversed());
// 方式2:负数技巧(不推荐大数)
list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()));list.sort(
Comparator.comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))
);说明:
nullsFirst → null 在最前面nullsLast → null 在最后面list.sort(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));当规则复杂(比如特殊业务逻辑)时:
list.sort((p1, p2) -> {
if (p1.getAge() == p2.getAge()) {
return p1.getName().length() - p2.getName().length();
}
return p1.getAge() - p2.getAge();
});原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。