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

Java 8 Lambda 表达式使用说明与案例

Java 8 Lambda 表达式使用说明与案例

Lambda 表达式是 Java 8 最重要的新特性之一,它使代码更加简洁,并支持函数式编程风格。

一、Lambda 表达式基础

1. 语法结构

(parameters) -> expression
或
(parameters) -> { statements; }

2. 基本特征

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别
  • 可选参数圆括号:一个参数无需圆括号,多个参数需要
  • 可选大括号:表达式主体只有一条语句时不需要大括号
  • 可选return关键字:表达式主体只有一条返回语句时,编译器会自动返回

3. 简单示例

// 1. 无参数,返回5
() -> 5// 2. 接收参数x,返回x*2
x -> x * 2// 3. 接收两个参数,返回它们的和
(int x, int y) -> x + y// 4. 接收字符串并打印
(String s) -> System.out.println(s)// 5. 接收两个参数,比较大小
(String s1, String s2) -> s1.compareTo(s2)

二、Lambda 使用案例

1. 集合遍历

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 传统方式
for (String name : names) {System.out.println(name);
}// Lambda方式
names.forEach(name -> System.out.println(name));// 方法引用方式
names.forEach(System.out::println);

2. 线程创建

// 传统方式
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统线程");}
}).start();// Lambda方式
new Thread(() -> System.out.println("Lambda线程")).start();

3. 集合排序

List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");// 传统方式
Collections.sort(languages, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}
});// Lambda方式
Collections.sort(languages, (o1, o2) -> o1.compareTo(o2));// 更简洁的方式
languages.sort((o1, o2) -> o1.compareTo(o2));

4. 过滤集合

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 过滤偶数
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());

5. 映射操作

List<String> words = Arrays.asList("hello", "world");// 将每个单词转为大写
List<String> upperCaseWords = words.stream().map(word -> word.toUpperCase()).collect(Collectors.toList());// 方法引用方式
List<String> upperCaseWords = words.stream().map(String::toUpperCase).collect(Collectors.toList());

6. 函数式接口使用

// 自定义函数式接口
@FunctionalInterface
interface GreetingService {void sayMessage(String message);
}// 使用Lambda实现
GreetingService greetService1 = message -> System.out.println("Hello " + message);
greetService1.sayMessage("World");GreetingService greetService2 = message -> System.out.println("你好 " + message);
greetService2.sayMessage("世界");

三、常用函数式接口

Java 8 在 java.util.function 包中提供了许多内置函数式接口:

  1. Predicate - 断言型接口

    Predicate<String> lengthCheck = s -> s.length() > 5;
    boolean result = lengthCheck.test("HelloWorld"); // true
    
  2. Function<T,R> - 函数型接口

    Function<String, Integer> lengthFunction = s -> s.length();
    int len = lengthFunction.apply("Java"); // 4
    
  3. Consumer - 消费型接口

    Consumer<String> printer = s -> System.out.println(s);
    printer.accept("Hello Lambda"); // 输出 Hello Lambda
    
  4. Supplier - 供给型接口

    Supplier<Double> randomSupplier = () -> Math.random();
    double randomValue = randomSupplier.get();
    

四、Lambda 表达式注意事项

  1. Lambda 表达式只能用于函数式接口(只有一个抽象方法的接口)
  2. Lambda 表达式中的局部变量必须是 final 或 effectively final
  3. Lambda 表达式没有自己的作用域,不能覆盖外部作用域的变量
  4. 在 Lambda 表达式中,this 关键字指的是包含它的外部类实例

五、方法引用

Lambda 表达式的简写形式,有四种类型:

  1. 静态方法引用 - ClassName::staticMethod

    Function<String, Integer> parser = Integer::parseInt;
    
  2. 实例方法引用 - instance::method

    String str = "Hello";
    Supplier<Integer> lengthSupplier = str::length;
    
  3. 任意对象的实例方法引用 - ClassName::method

    List<String> names = Arrays.asList("Alice", "Bob");
    names.forEach(System.out::println);
    
  4. 构造方法引用 - ClassName::new

    Supplier<List<String>> listSupplier = ArrayList::new;
    

Lambda 表达式极大地简化了 Java 代码,特别是在集合操作和并发编程中,使代码更加简洁和易读。

http://www.xdnf.cn/news/617455.html

相关文章:

  • 前端测试简介
  • Python排序函数全面指南:从基础到高级
  • 字符编码详解:ASCII、Latin1、Unicode、UTF-8 与 GBK
  • 365打卡第N1周: one-hot编码案例
  • 【数据反哺运营】用Python构建可落地的商品结构分析方法论-某朴超市
  • 【风控】申请评分卡(A卡)模型
  • QString 写时拷贝简介
  • 2025年电工杯B题思路讲解问题一四种算法
  • Java 集合框架核心知识点全解析:从入门到高频面试题(含 JDK 源码剖析)
  • 解决:dpkg: error: dpkg frontend lock is locked by another process
  • Coze工作流-变量聚合模块的应用
  • IEEE 流程
  • OSS对象存储如何避免被攻击恶意刷流量?
  • QT中延时的用法及定时器的用法
  • 异地容灾、热备与冷备:核心概念解析、技术对比及行业解决方案指南
  • 在Android APK中使用WebView加载Vue项目并实现文件导出
  • 电网绝缘子及破损、闪络缺陷YOLO数据集
  • 【工具变量】地级市创新重视程度数据及城市创新重视程度数据(2003-2025年)
  • 旅游信息检索
  • 每日算法-250523
  • 1.2.1+1.2.2计算机硬件的基本组成
  • 通信专业速成solidworks学习记录
  • 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(上)
  • 本地分支git push 报错 fatal: The current branch XXXX has no upstream branch.
  • 负号和连接号的区别?
  • 【C++】20. AVL树的实现
  • Python+requests实现接口自动化测试
  • 机器学习 Day1
  • 【python】局域网内通过python远程重启另一台windows电脑
  • Ntfs!ReadIndexBuffer函数调用Ntfs!NtfsMapStream函数的参数FileOffset为什么是0