【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 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。

相关推荐
郭涤生8 分钟前
Chapter 2:A Tale of Two Values_《clean architecture》notes
开发语言·c++·笔记
<但凡.26 分钟前
C++修炼:string类的使用
开发语言·c++·算法
helbyYoung30 分钟前
【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发
开发语言·javascript
qianmoq1 小时前
轻松掌握Java多线程 - 第一章:多线程入门
java
杨凯凡1 小时前
JUnit 全面指南:从基础到高级测试实践
java·junit·单元测试
cccl.1 小时前
MyBaitis-Plus 使用动态表名 selectPage 不生效
java·mybatis
小张-森林人1 小时前
C#中,什么是委托,什么是事件及它们之间的关系
开发语言·c#
mask哥1 小时前
一文详解k8s体系架构知识
java·spring boot·docker·微服务·云原生·架构·kubernetes
何似在人间5751 小时前
JAVA实现动态IP黑名单过滤
java·开发语言·tcp/ip·nacos·黑名单过滤
Lvan1 小时前
程序员必看:两个思想优化90%的代码
java·后端