程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Java8新特性

    • Java8新特性简介
    • Lambda 表达式
      • 1. Lambda 表达式概述
      • 2. 使用 Lambda 表达式的前提
      • 3. 常见使用场景及实现
        • 1. 多线程任务中的 Lambda 表达式
        • 2. 集合操作中的 Lambda 表达式
        • 3. 事件处理中的 Lambda 表达式
      • 4. 总结
    • 函数式接口
    • 方法的引用
    • 构造器和数组的引用
    • Stream 流式编程
    • 并行流与串行流
    • Optional 类的使用
    • 对反射的支持增强
    • 接口中的默认方法与静态方法
    • 新时间日期API
    • Try-with-Resources 升级
    • 重复注解与类型注解
  • Java9新特性

  • Java10新特性

  • Java11新特性

  • Java12新特性

  • Java13新特性

  • Java14新特性

  • Java15新特性

  • Java新特性
  • Java8新特性
scholar
2024-08-24
目录

Lambda 表达式

# Lambda 表达式

  • 1. Lambda 表达式概述
  • 2. 使用 Lambda 表达式的前提
  • 3. 常见使用场景及实现
    • 1. 多线程任务中的 Lambda 表达式
    • 2. 集合操作中的 Lambda 表达式
    • 3. 事件处理中的 Lambda 表达式
  • 4. 总结

# 1. Lambda 表达式概述

Lambda 表达式是 Java 8 引入的一种匿名函数,它可以将代码块作为数据进行传递。Lambda 表达式简化了函数式接口的实现(函数式接口是指只有一个抽象方法的接口)。通过 Lambda 表达式,可以大幅减少代码冗余,提高代码的简洁性和可读性。

Lambda 表达式的基本语法:

(parameters) -> expression
(parameters) -> { statements }
1
2
  • 参数部分:可以有一个或多个参数。如果只有一个参数且无类型声明,括号可以省略。
  • 箭头符号 ->:分隔参数和代码块。
  • 代码块:如果代码块中只有一行语句,可以省略大括号 {} 和 return 关键字。

参数类型: 在 Lambda 表达式中,参数的类型可以省略(类型推断),也可以显式指定类型。例如:

// 省略类型
(str) -> System.out.println(str);

// 显式指定类型
(String str) -> System.out.println(str);
1
2
3
4
5

# 2. 使用 Lambda 表达式的前提

Lambda 表达式的使用前提是:必须有一个函数式接口对象接收。Lambda 表达式的本质是对接口中唯一抽象方法的实现。因此,在使用 Lambda 表达式时,首先要明确将要实现的函数式接口,并根据接口的抽象方法来书写表达式。

# 3. 常见使用场景及实现

Lambda 表达式在实际开发中主要用于以下场景:

  1. 简化函数式接口的实现:当接口中只有一个抽象方法时,Lambda 表达式是最简洁的实现方式。
  2. 集合操作与流处理:如数据过滤、映射、排序等操作,通过 Lambda 表达式与 Stream API 搭配使用非常高效。
  3. 回调函数与事件处理:如任务调度、异步操作、GUI 事件处理等,Lambda 表达式可以简化回调逻辑。

# 1. 多线程任务中的 Lambda 表达式

场景描述: 在多线程编程中,我们通常需要创建并执行任务。Runnable 接口是一个典型的函数式接口,只有一个无参无返回值的抽象方法 run()。

接口方法: void run();

public class LambdaExample1 {
    public static void main(String[] args) {
        // 使用传统方式实现 Runnable 接口
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello from traditional Runnable!");
            }
        };
        r1.run();

        // 使用 Lambda 表达式实现 Runnable 接口
        Runnable r2 = () -> System.out.println("Hello from Lambda!");
        r2.run();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

解释:

  • Runnable 接口中的抽象方法 run() 没有参数也没有返回值,因此 Lambda 表达式直接书写为 () -> System.out.println("...");。
  • 传统方式需要创建匿名内部类,而 Lambda 表达式省去了冗长的代码。

实际应用场景: 在多线程编程中用于创建和执行简单任务。

API 说明:

  • Runnable:函数式接口,定义了无参无返回值的 run() 方法。

# 2. 集合操作中的 Lambda 表达式

场景描述: 在数据处理过程中,经常需要对集合进行排序。Comparator 接口用于定义排序规则,它的抽象方法 compare(T o1, T o2) 接受两个参数并返回比较结果。

接口方法: int compare(T o1, T o2);

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class LambdaExample2 {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 9, 1, 7);

        // 使用传统方式进行排序
        numbers.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println("Sorted with traditional approach: " + numbers);

        // 使用 Lambda 表达式进行排序
        numbers.sort((o1, o2) -> o1.compareTo(o2));
        System.out.println("Sorted with Lambda: " + numbers);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

解释:

  • Comparator 接口的 compare() 方法接收两个参数并返回一个 int 值表示比较结果。Lambda 表达式根据这个方法的定义,实现了比较逻辑。
  • 传统方式中需要实现匿名内部类,而 Lambda 表达式简化了这一过程。

实际应用场景: 在集合排序、数据比较时使用。

API 说明:

  • Comparator<T>:函数式接口,定义了 compare(T o1, T o2) 方法用于比较两个对象。

# 3. 事件处理中的 Lambda 表达式

场景描述: 在 GUI 应用或异步任务中,经常需要传递回调函数来处理事件。Consumer<T> 接口是一个典型的消费型接口,接受一个参数但不返回结果。

接口方法: void accept(T t);

import java.util.function.Consumer;

public class LambdaExample3 {
    public static void main(String[] args) {
        // 使用传统方式实现 Consumer 接口
        Consumer<String> con1 = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("Traditional Consumer: " + s);
            }
        };
        con1.accept("Hello!");

        // 使用 Lambda 表达式实现 Consumer 接口
        Consumer<String> con2 = (s) -> System.out.println("Lambda Consumer: " + s);
        con2.accept("Hello, Lambda!");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

解释:

  • Consumer<T> 接口的 accept() 方法接受一个参数且无返回值,Lambda 表达式根据这一方法定义,实现了参数输出的逻辑。
  • Lambda 表达式使得事件处理代码更加简洁明了。

实际应用场景: 在处理用户输入、日志输出、数据校验等场景中使用。

API 说明:

  • Consumer<T>:函数式接口,定义了 accept(T t) 方法用于处理单个输入参数。

# 4. 总结

  • Lambda 表达式的核心在于简化函数式接口的实现。 当你明确函数式接口的抽象方法的参数和返回值时,Lambda 表达式会根据这些要求来实现代码。
  • 参数类型可省略:Lambda 表达式中参数的类型可以根据上下文推断,类型可写可不写。
  • 使用 Lambda 表达式时,聚焦于接口定义:根据接口抽象方法的定义书写表达式即可,无需过多关注语法格式的多样性。
  • 场景驱动使用:Lambda 表达式特别适用于简化回调、事件处理、集合操作等场景中的代码实现。

通过理解函数式接口的抽象方法,结合具体的使用场景,可以更高效地应用 Lambda 表达式,使代码简洁、直观、易维护。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Java8新特性简介
函数式接口

← Java8新特性简介 函数式接口→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式