lambda表达式与常用方法

本文深入讲解Java8中Lambda表达式的概念、语法及应用场景,包括如何使用Lambda表达式简化代码、方法引用、构造方法引用,以及在stream流操作、排序、过滤、匹配和收集等常见操作中的应用。

1、什么是lambda,是java8新的特性,是一个匿名函数,可以非常简洁的实现接口。                                                                                     lambda对接口的要求:接口里面的抽象方法只能够存在一个,或者被@FunctionalInterface修饰接口,或者接口中有一个抽象方法,其他的都是dafault或者静态方法。

2、Lambda定义的三个语法:                                                                                                                                                                                         (params) -> 单行语句;                                                                                                                                                                                     (params) ->表达式;                                                                                                                                                                                         (params) ->{多行语句};                                                                                                                                                               lambda需要关注方法的参数列表和方法体,()描述参数列表;{}描述方法体;->lambda运算符,gos to                                                        无参无返回:Interface inter1 = () -> {System.out.println(无参无返回")} 

3、精简:lambda表达式中参数的类型可以省略,因为在接口中的方法已经定义了类型; 如果参数的数量只有一个,可以省略小括号;方法体中只有一条语句,此时大括号可以省略,如果该语句是返回语句,省略大括号的同时省略return。

   例如  Interface inter1 = x -> System.out.println("无参无返回")                                                                                                                                    Interface inter1 = x -> change(x) 

4、普通方法引用  Interface inter1 = x-> Sysclass::change                                                                                                                                   构造方法引用  Interface inter1 = Sysclass::new(无参构造方法)返回Sysclass对象

5、常用的lambda表达式:

1)  new Thread( () -> System.out.println("In")).start();  实现了Runnable接口中的run()方法,该方法没有参数,大括号内的表达式就是该run方法的实现,如上面3所说,这个前提就是接口里面的抽象方法只能够存在一个。

2)stream流Java 8 中的stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation),生成流的两种方式:stream()− 为集合创建串行流。parallelStream() − 为集合创建并行流。

3)map用法接受一个函数作为参数,并将函数应用到每一个元素上,返回新的元素list. 

获取list中每个元素的name属性组成一个新的list。

4)sorted()用法:                                                                                                                                                                                       sorted()产生一个新流,其中按自然顺序排序;sorted(Comparator comp)产生一个新流,其中按比较器顺序排                                             例如:Comparator comparator = (String o1, String o2) -> o1.compareTo(o2);  按升序排序

array.stream().map(testCode1 -> testCode1.getAge()).sorted(comparator).foreach(System.out::println);

5)match相关的方法:

allMatch(Predicate p):检查是否匹配所有元素

如:Boolean isMatch = array.stream().allMatch(t -> t.getAge() > 23),是否有年龄大于23的元素,返回的是布尔类型。

6)reduce相关方法:将元素中的值以某种方式连接起来

例如:Optional result = array.stream().map(e -> e.getAge()).reduce((x, y) -> x + "," + y);  输出:24,25

7)collect(Collector c)将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

注:摘自:https://www.cnblogs.com/maikucha/p/8435906.html

 

 

 

 

 

 

 

 

<think> 我们正在讨论Lambda表达式常用方法。根据用户之前的提问和引用内容,用户已经了解Lambda的基本概念和作用,现在想了解其常用方法(即常用写法、常见使用场景的具体写法)。 结合引用[1][2][3],我们可以总结出以下几种常用方法: 1. 替代匿名内部类(尤其是函数式接口的实现) 2. 集合操作(Stream API中的filter, map, collect等) 3. 方法引用(进一步简化Lambda表达式) 4. 多参数Lambda表达式的简化过程(从完整写法到最简写法) 我们可以按照以下结构组织答案: 一、基本语法结构(回顾) 二、常用方法(核心部分) 1. 替代匿名内部类(举例:线程、事件处理) 2. 集合操作(重点展示filter, map, collect等链式调用) 3. 方法引用(三种主要类型:静态方法引用、实例方法引用、构造器引用) 4. 多参数Lambda的简化步骤(展示从完整到最简的过程) 三、注意事项(变量捕获、异常处理等) 四、相关问题 注意:用户提供的引用中已经有一些例子,我们可以引用并扩展。 </think> ### Lambda 表达式常用方法详解 Lambda 表达式通过简化函数式接口实现,显著提升代码简洁性可读性。以下是实际开发中的**6 种核心用法**,结合具体场景说明: --- #### 一、替代匿名内部类(精简 70% 代码) **适用场景**:实现单方法接口(如 `Runnable`, `Comparator`) ```java // 传统匿名类 new Thread(new Runnable() { @Override public void run() { System.out.println("运行"); } // 5行 }).start(); // Lambda 精简版 new Thread(() -> System.out.println("运行")).start(); // 1行 [^1] ``` > ✅ 本质:自动实现接口的**唯一抽象方法**(此处实现 `Runnable.run()`) --- #### 二、集合操作(Stream API 核心) **常用方法链**:`filter()` → `map()` → `collect()` ```java List<String> words = Arrays.asList("apple", "banana", "cherry"); // 过滤长度>5的单词并转大写 List<String> result = words.stream() .filter(s -> s.length() > 5) // Predicate 接口 .map(String::toUpperCase) // Function 接口(方法引用) .collect(Collectors.toList()); // 结果: [BANANA, CHERRY] [^2] ``` --- #### 三、方法引用(进一步简化 Lambda) **三种核心类型**: | 类型 | 示例 | 等效 Lambda | |---------------------|--------------------------|---------------------| | 静态方法引用 | `Integer::sum` | `(a,b) -> a+b` | | 实例方法引用 | `System.out::println` | `s -> System.out.println(s)` | | 构造器引用 | `ArrayList::new` | `() -> new ArrayList<>()` | ```java // 使用方法引用求和 int sum = calculateNum(Integer::sum); // 等效 (a,b) -> a+b [^1] ``` --- #### 四、多参数 Lambda 的简化演进 以函数式接口 `Fun` 为例对比演化过程: ```java // 1. 原始匿名类 (8行) Fun fun1 = new Fun() { @Override public void print(String s1, String s2) { System.out.println(s1 + "," + s2); } }; // 2. Lambda 完整版 (显式类型) Fun fun2 = (String s1, String s2) -> { System.out.println(s1 + "," + s2); }; // 3. 省略参数类型 Fun fun3 = (s1, s2) -> { System.out.println(s1 + "," + s2); }; // 4. 单行省略 {} (最简版) Fun fun4 = (s1, s2) -> System.out.println(s1 + "," + s2); [^3] ``` > 关键简化点: > 1. 编译器自动推断参数类型 > 2. 单行逻辑可省略 `{}` 和 `return` --- #### 五、延迟执行(`Supplier` 接口) **适用场景**:高开销操作的按需触发 ```java public String loadConfig(Supplier<String> supplier) { if (isDebugMode) { return supplier.get(); // 仅调试模式下执行 } return "default"; } // 调用时封装逻辑 String config = loadConfig(() -> { // 模拟耗时操作 return readConfigFromDB(); }); ``` --- #### 六、事件处理(GUI/回调) ```java // JavaFX 按钮事件 button.setOnAction(event -> { System.out.println("点击事件触发"); updateUI(); // 执行业务逻辑 }); // 等效匿名类 button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("点击事件触发"); updateUI(); } }); ``` --- ### 总结:Lambda 的核心价值矩阵 | 应用场景 | Lambda 优势 | 等效代码减少比例 | |-------------------|--------------------------------------|------------------| | 集合操作 | 链式调用取代嵌套循环 | 60%~80% | | 接口实现 | 消除模板代码 | 70%+ | | 行为参数化 | 动态注入逻辑(如排序规则) | 50%~70% | | 延迟执行 | 避免不必要的计算开销 | 40%~60% | --- ### 相关问题 1. Lambda 表达式中的异常应该如何处理? 2. 方法引用和 Lambda 表达式在字节码层面有何区别? 3. 为什么 Lambda 表达式只能用于函数式接口? 4. 如何在 Android 开发中高效使用 Lambda 表达式? 5. Stream API 的并行流 (`parallelStream()`) 有哪些使用陷阱? > 参考文献: > [^1]: Lambda 表达式的基本语法和应用场景 > [^2]: Java 8 Stream API 操作指南 > [^3]: 函数式接口的 Lambda 简化演进过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值