在 Java 开发中,Lambda 表达式是函数式编程的核心特性,它能大幅简化代码结构,让开发者更专注于 “做什么” 而非 “怎么实现”。本文将从思想概述、实际体验、语法规则到实战练习,带你全面掌握 Lambda 表达式的使用。

一、函数式编程思想:告别冗余,聚焦核心

函数式编程的核心思想源于数学中的函数概念 —— 强调 “数据操作” 本身,而非依托对象的复杂语法。

  • 面向对象编程:需通过对象封装行为,注重 “以什么形式做”。
  • 函数式编程:忽略对象语法冗余,直接定义行为逻辑,注重 “做什么”。Lambda 表达式正是这种思想的落地实现,让代码更简洁、逻辑更清晰。

二、Lambda 表达式初体验:从 3 种方案看简化魅力

以 “启动线程输出指定内容” 为例,对比传统写法与 Lambda 写法的差异,直观感受其优势。

方案 1:传统实现 Runnable 接口

需单独定义实现类,重写 run () 方法,代码冗余,适合复杂逻辑复用场景。

public class LambdaDemo {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread t = new Thread(myRunnable);
        t.start();
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("多线程启动了");
    }
}

方案 2:匿名内部类改进

无需定义独立实现类,减少代码文件,但仍保留接口实现的冗余模板。

public class LambdaDemo {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("多线程启动了");
            }
        }).start();
    }
}

方案 3:Lambda 表达式终极简化

完全剥离接口实现的模板代码,直接聚焦核心逻辑,一行搞定需求。

public class LambdaDemo {
    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("多线程启动了");
        }).start();
    }
}

三、Lambda 表达式标准格式:三要素缺一不可

Lambda 表达式的语法固定,由 “形式参数、箭头、代码块” 三部分组成,核心格式如下:

(形式参数) -> { 代码块 }

各部分规则说明

  1. 形式参数:无参数时留空;多个参数用逗号分隔;参数类型可省略(编译器自动推断)。
  2. 箭头(->):英文中划线 + 大于号组成,固定写法,用于连接参数与逻辑体。
  3. 代码块:包含具体业务逻辑,若只有一行代码可省略大括号;有返回值时,单行代码可省略 return 关键字。

四、Lambda 实战练习:覆盖 5 种核心场景

Lambda 的使用前提有两个:一是必须基于接口,二是接口中仅有一个抽象方法(这类接口称为 “函数式接口”)。以下是 5 种常见场景的实战案例。

1. 无参无返回值

// 函数式接口
public interface NoReturnNoParam {
    void method();
}

// Lambda实现与调用
public class LambdaDemo {
    public static void main(String[] args) {
        NoReturnNoParam noReturnNoParam = () -> {
            System.out.println("无参无返回值场景");
        };
        noReturnNoParam.method();
    }
}

2. 一个参数无返回值

// 函数式接口
public interface NoReturnOneParam {
    void method(int a);
}

// Lambda实现与调用(参数类型可省略)
NoReturnOneParam noReturnOneParam = (a) -> {
    System.out.println("一个参数无返回值,参数:" + a);
};
noReturnOneParam.method(6);

3. 多参数无返回值

// 函数式接口
public interface NoReturnMultiParam {
    void method(int a, int b);
}

// Lambda实现与调用
NoReturnMultiParam noReturnMultiParam = (a, b) -> {
    System.out.println("多参数无返回值,参数:" + a + "," + b);
};
noReturnMultiParam.method(3, 5);

4. 一个参数有返回值

// 函数式接口
public interface ReturnOneParam {
    int method(int a);
}

// Lambda实现与调用(单行代码省略大括号和return)
ReturnOneParam returnOneParam = a -> a * 2;
int result = returnOneParam.method(6);
System.out.println("一个参数有返回值,结果:" + result);

5. 多参数有返回值

// 函数式接口
public interface ReturnMultiParam {
    int method(int a, int b);
}

// Lambda实现与调用
ReturnMultiParam returnMultiParam = (a, b) -> {
    System.out.println("多参数有返回值,参数:" + a + "," + b);
    return a + b;
};
int sum = returnMultiParam.method(6, 8);
System.out.println("多参数有返回值,结果:" + sum);

五、核心总结

Lambda 表达式的核心价值是 “简化代码、聚焦逻辑”,其关键要点可概括为:

  1. 依赖函数式接口(仅一个抽象方法)。
  2. 语法简洁,三要素(参数、箭头、代码块)灵活适配不同场景。
  3. 替代匿名内部类,减少模板代码,提升开发效率。

适合用于简单逻辑场景(如线程任务、集合遍历、回调函数等),复杂逻辑仍建议使用传统类或方法封装,保证代码可读性。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐