【Java 8】Lambda表达式介绍

目录

1、Lambda简介

2、语法介绍

3、Lambda表达式示例

[3.1、无参数的 Lambda 表达式](#3.1、无参数的 Lambda 表达式)

[3.2、单个参数的 Lambda 表达式](#3.2、单个参数的 Lambda 表达式)

[3.3、多个参数的 Lambda 表达式](#3.3、多个参数的 Lambda 表达式)

[3.4、带语句块的 Lambda 表达式](#3.4、带语句块的 Lambda 表达式)

4、Lambda使用场景

4.1、替代匿名内部类

4.2、集合操作

4.3、排序

4.4、函数式接口

4.4.1、自定义函数式接口

4.4.2、常用内置函数式接口

4.5、方法引用

4.5.1、静态方法引用

4.5.2、实例方法引用

4.5.3、构造方法引用

[5、Lambda 表达式的变量作用域](#5、Lambda 表达式的变量作用域)

[6、Lambda 表达式的限制](#6、Lambda 表达式的限制)

7、总结


1、Lambda简介

Java 8 引入了 Lambda 表达式,这是 Java 语言的一个重要特性,使得代码更加简洁和易读。Lambda 表达式允许你将功能作为方法参数传递,或者将代码作为数据来处理。

2、语法介绍

java 复制代码
(parameters) -> expression

或者

java 复制代码
(parameters) -> { statements; }
  • parameters: 参数列表,可以为空或包含一个或多个参数。

  • ->: Lambda 操作符,将参数和表达式或语句块分开。

  • expression: 单个表达式,Lambda 表达式会返回该表达式的结果。

  • { statements; } : 语句块,可以包含多条语句,需要使用 return 语句返回值(如果有返回值)。

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

java 复制代码
() -> System.out.println("Hello, World!");

3.2、单个参数的 Lambda 表达式

java 复制代码
x -> x * x

3.3、多个参数的 Lambda 表达式

java 复制代码
(x, y) -> x + y

3.4、带语句块的 Lambda 表达式

java 复制代码
(x, y) -> {
    int sum = x + y;
    return sum;
}

4、Lambda使用场景

4.1、替代匿名内部类

Lambda 表达式常用于替代匿名内部类,尤其是在使用函数式接口时。

java 复制代码
// 使用匿名内部类
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");

4.2、集合操作

Lambda 表达式可以与 Java 8 引入的 Stream API 结合使用,简化集合操作。

java 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 使用 Lambda 表达式遍历集合
names.forEach(name -> System.out.println(name));

// 使用 Lambda 表达式过滤集合
List<String> filteredNames = names.stream()
                                  .filter(name -> name.startsWith("A"))
                                  .collect(Collectors.toList());

4.3、排序

Lambda 表达式可以简化排序操作。

java 复制代码
List<String> names = Arrays.asList("Charlie", "Alice", "Bob");

// 使用 Lambda 表达式排序
names.sort((a, b) -> a.compareTo(b));

4.4、函数式接口

Lambda 表达式通常与函数式接口一起使用。函数式接口是只包含一个抽象方法的接口。Java 8 提供了许多内置的函数式接口,如 RunnableCallableComparator 等。

4.4.1、自定义函数式接口

你可以定义自己的函数式接口,然后使用表达式实现。

java 复制代码
@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod();
}


MyFunctionalInterface mfi = () -> System.out.println("My Method");
mfi.myMethod();

4.4.2、常用内置函数式接口

  • Predicate<T>: 接受一个参数并返回一个布尔值。

  • Consumer<T>: 接受一个参数并执行操作,不返回任何结果。

  • Function<T, R>: 接受一个参数并返回一个结果。

  • Supplier<T>: 不接受参数,返回一个结果。

4.5、方法引用

方法引用是 Lambda 表达式的一种简化形式,用于直接引用已有方法。

4.5.1、静态方法引用

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);

4.5.2、实例方法引用

java 复制代码
String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
System.out.println(lengthSupplier.get());

4.5.3、构造方法引用

java 复制代码
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();

5、Lambda 表达式的变量作用域

Lambda 表达式可以访问外部的局部变量,但这些变量必须是 final 或事实上是 final 的(即不可变)。

java 复制代码
int num = 10;
Runnable r = () -> System.out.println(num); // num 必须是 final 或事实上是 final

6、Lambda 表达式的限制

  • Lambda 表达式只能用于函数式接口。

  • Lambda 表达式不能包含 breakcontinue 语句。

  • Lambda 表达式不能抛出检查异常(除非函数式接口允许)。

7、总结

Java 8 的 Lambda 表达式极大地简化了代码,使得函数式编程在 Java 中变得更加容易。通过 Lambda 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。

相关推荐
飒飒真编程5 分钟前
C++类模板继承部分知识及测试代码
开发语言·c++·算法
NE_STOP30 分钟前
SpringBoot--如何整体读取多个配置属性及其相关操作
java·spring
apihz1 小时前
通用图片搜索-搜狗源免费API接口使用指南
android·java·python·php·音视频
博睿谷IT99_1 小时前
华为数据通信网络基础
开发语言·华为·php·华为认证
蓝桉(努力版)1 小时前
MATLAB可视化5:华夫图(饼图的平替可以表示种类的分布,附有完整代码详细讲解)(求个关注、点赞和收藏)(对配色不满意可以自己调节配色,附调色教程)
开发语言·数学建模·matlab·信息可视化·matlab可视化
风象南1 小时前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
素雪风华1 小时前
Jenkins+Gitee+Docker容器化部署
java·docker·gitee·jenkins·springboot·持续部署
艾莉丝努力练剑1 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
云空1 小时前
《QtPy:Python与Qt的完美桥梁》
开发语言·python·qt·pyqt
晓13132 小时前
JavaScript加强篇——第六章 定时器(延时函数)与JS执行机制
开发语言·javascript·ecmascript