当前位置: 首页 > news >正文

【Java 8】Lambda表达式介绍

目录

1、Lambda简介

2、语法介绍

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

3.2、单个参数的 Lambda 表达式

3.3、多个参数的 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 表达式的变量作用域

6、Lambda 表达式的限制

7、总结


 

1、Lambda简介

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

2、语法介绍

(parameters) -> expression

或者

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

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

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

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

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

() -> System.out.println("Hello, World!");

3.2、单个参数的 Lambda 表达式

x -> x * x

3.3、多个参数的 Lambda 表达式

(x, y) -> x + y

3.4、带语句块的 Lambda 表达式

(x, y) -> {
    int sum = x + y;
    return sum;
}

 4、Lambda使用场景

4.1、替代匿名内部类

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

// 使用匿名内部类
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 结合使用,简化集合操作。

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 表达式可以简化排序操作。

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、自定义函数式接口

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

@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、静态方法引用

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

4.5.2、实例方法引用

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

4.5.3、构造方法引用 

Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();

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

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

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

6、Lambda 表达式的限制

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

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

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

7、总结

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

相关文章:

  • 嵌入式学习第二十一天--线程
  • 登录-10.Filter-详解(过滤器链)
  • 探秘Transformer系列之(6)--- token
  • 【C++设计模式】观察者模式(1/2):从基础到优化实现
  • MySQL数据库的基本命令
  • 标定系列——基于标定板的相机内参与LiDAR-相机外参联合标定方法
  • Spring Security面试题
  • BFS 解决 拓扑排序(典型算法思想)—— OJ例题算法解析思路
  • 爬虫解析库:parsel的详细使用
  • 类和对象之间的区别是什么
  • Vue3项目与pnpm使用教程
  • 若依前后端分离框架修改3.8.9版本(重点在安全框架讲解与微信小程序登录集成)
  • gihub上适合练手的Python项目(2)
  • P8772 [蓝桥杯 2022 省 A] 求和--简单题的陷阱——(不开long long见祖宗!!!
  • SpringSecurity处理器:登录成功处理器、登录失败处理器、无权限处理器、注销成功处理器
  • TVS管学习记录
  • Threejs教程一【三要素】
  • 01.Zabbix 概述
  • 算法日常刷题笔记(2)
  • c++面试准备
  • 整形医院网站建设/网店推广方案策划书
  • 品牌建设管理办法/提高seo关键词排名
  • 做网站设计收入/sem是什么显微镜
  • 佛山市网站建设分站哪家好/站长之家网站介绍
  • 网站界面(UI)设计/小程序开发教程
  • 校园网网站建设/网页制作html代码