首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【JavaSE】Lambda 表达式

【JavaSE】Lambda 表达式

原创
作者头像
lirendada
发布2026-03-26 19:36:00
发布2026-03-26 19:36:00
880
举报
文章被收录于专栏:JavaJava

Ⅰ. 什么是 Lambda 表达式

Lambda 表达式是 JavaSE8 中一个重要的新特性,它允许通过表达式来代替功能接口。

Lambda 表达式和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(可以是一个表达式或一个代码块)。基本语法如下所示:

代码语言:javascript
复制
(parameters) -> expression
或者
(parameters) -> { statements; }

举一些例子:

代码语言:javascript
复制
// 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 表达式的使用

代码语言:javascript
复制
@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));
    }
}

☠ 注意事项:

  1. 参数类型可以省略。如果需要省略,每个参数的类型都要省略。
  2. 参数的小括号里面只有一个参数,那么小括号可以省略
  3. 如果方法体当中只有一句代码,那么大括号可以省略
  4. 如果方法体中只有一条语句,且是 return 语句,那么大括号可以省略,且去掉 return 关键字。
  5. lambda 表达式捕获变量的规则,和匿名内部类是一样的,具体可以参考匿名内部类笔记
  6. lambda 表达式是 "函数式接口" 的一个匿名实现对象,区分开以下两者的区别:
    代码语言:javascript
    复制
    // 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)

安全的数值比较,避免溢出:

代码语言:javascript
复制
list.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));

适用于:

  • int, double, long 等基本类型
  • 数值比较安全性优先(避免 a - b 的溢出问题)

2. 方法引用 + Comparator.comparing

最简洁可读的写法:

代码语言:javascript
复制
list.sort(Comparator.comparing(Person::getAge));

优点:

  • 语义明确,别人一看就知道是按年龄排序
  • 支持链式调用 .thenComparing(...)

3. 多条件排序

代码语言:javascript
复制
list.sort(
    Comparator.comparing(Person::getAge)
              .thenComparing(Person::getName)
);

场景:

  • 先按主条件排(年龄)
  • 如果相同,再按次条件(名字)

4. 倒序排序

两种常见方式:

代码语言:javascript
复制
// 方式1:reversed()
list.sort(Comparator.comparing(Person::getAge).reversed());

// 方式2:负数技巧(不推荐大数)
list.sort((p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()));

5. 处理 null 值

代码语言:javascript
复制
list.sort(
    Comparator.comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo))
);

说明:

  • nullsFirst → null 在最前面
  • nullsLast → null 在最后面

6. 字符串比较(忽略大小写)

代码语言:javascript
复制
list.sort(Comparator.comparing(Person::getName, String.CASE_INSENSITIVE_ORDER));

7. 完全自定义规则

当规则复杂(比如特殊业务逻辑)时:

代码语言:java
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ⅰ. 什么是 Lambda 表达式
  • Ⅱ. Lambda 表达式的使用
  • 列表排序的常用写法
    • 1. 基本比较(数值)
      • Integer.compare(a, b)
    • 2. 方法引用 + Comparator.comparing
    • 3. 多条件排序
    • 4. 倒序排序
    • 5. 处理 null 值
    • 6. 字符串比较(忽略大小写)
    • 7. 完全自定义规则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档