java-Lambda表达式1

## Java中的Lambda表达式

### 1. 简介

Lambda表达式是Java 8引入的一项重要新特性,它是Java对函数式编程支持的一部分。Lambda表达式允许将匿名函数作为参数传递,简化了代码,提升了可读性和可维护性。Lambda表达式的主要目的是使代码更加简洁、灵活,尤其在处理集合、并发编程以及GUI编程中。

### 2. Lambda表达式的基本语法

Lambda表达式的基本语法形式如下:

```
(parameters) -> expression

(parameters) -> { statements }
```

#### 2.1 参数列表

参数列表可以为空,也可以包含一个或多个参数。多个参数之间用逗号分隔。

- 如果只有一个参数且无类型,可以省略圆括号。例如:`x -> x * x`
- 如果参数有类型,必须包括在圆括号内。例如:`(int x, int y) -> x + y`

#### 2.2 箭头符号

箭头符号 `->` 用于将参数列表与表达式或代码块分开。

#### 2.3 方法体

方法体可以是一个单一的表达式,也可以是一个包含多条语句的代码块。如果是单一表达式,结果会自动返回。如果是代码块,必须显式使用 `return` 语句返回结果。

### 3. Lambda表达式的使用示例

下面是一些使用Lambda表达式的基本示例:

#### 3.1 无参数的Lambda表达式

```java
Runnable r1 = () -> System.out.println("Hello, World!");
r1.run();
```

#### 3.2 一个参数的Lambda表达式

```java
UnaryOperator<Integer> square = x -> x * x;
System.out.println(square.apply(5));  // 输出: 25
```

#### 3.3 多个参数的Lambda表达式

```java
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3, 5));  // 输出: 8
```

### 4. 函数式接口

Lambda表达式可以替代匿名类,尤其是在实现函数式接口时。函数式接口是只包含一个抽象方法的接口,可以包含多个默认方法和静态方法。

#### 4.1 函数式接口示例

```java
@FunctionalInterface
interface MyFunctionalInterface {
    void execute();
}
```

#### 4.2 使用Lambda表达式实现函数式接口

```java
MyFunctionalInterface myFunc = () -> System.out.println("Executing...");
myFunc.execute();
```

Java 8中的许多新特性都是基于函数式接口实现的,如`java.util.function`包中的接口。

### 5. 常用的函数式接口

Java 8引入了一些常用的函数式接口,这些接口都在`java.util.function`包中定义。

#### 5.1 `Predicate<T>`

`Predicate` 接口用于对输入参数进行判断,返回一个布尔值。

```java
Predicate<Integer> isEven = x -> x % 2 == 0;
System.out.println(isEven.test(4));  // 输出: true
```

#### 5.2 `Function<T, R>`

`Function` 接口用于将输入参数转换为另一种类型的结果。

```java
Function<String, Integer> stringLength = s -> s.length();
System.out.println(stringLength.apply("Lambda"));  // 输出: 6
```

#### 5.3 `Consumer<T>`

`Consumer` 接口用于对输入参数进行操作但不返回结果。

```java
Consumer<String> print = s -> System.out.println(s);
print.accept("Hello, Lambda!");  // 输出: Hello, Lambda!
```

#### 5.4 `Supplier<T>`

`Supplier` 接口用于提供一个结果,不需要输入参数。

```java
Supplier<Double> random = () -> Math.random();
System.out.println(random.get());
```

#### 5.5 `BinaryOperator<T>`

`BinaryOperator` 接口用于对两个相同类型的参数进行操作,并返回与参数类型相同的结果。

```java
BinaryOperator<Integer> multiply = (a, b) -> a * b;
System.out.println(multiply.apply(3, 4));  // 输出: 12
```

### 6. Lambda表达式在集合框架中的应用

Lambda表达式与Java集合框架结合使用,可以极大地简化代码。

#### 6.1 使用Lambda表达式进行集合遍历

```java
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s));
```

#### 6.2 使用Lambda表达式进行集合过滤

```java
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
List<String> filtered = strings.stream()
                               .filter(s -> !s.isEmpty())
                               .collect(Collectors.toList());
System.out.println(filtered);
```

#### 6.3 使用Lambda表达式进行集合映射

```java
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream()
                                   .map(i -> i * i)
                                   .distinct()
                                   .collect(Collectors.toList());
System.out.println(squaresList);
```

### 7. 方法引用

方法引用是Lambda表达式的另一种简洁形式。它使用现有的方法定义作为Lambda表达式的一部分。

#### 7.1 静态方法引用

```java
Function<String, Integer> parseInt = Integer::parseInt;
System.out.println(parseInt.apply("123"));  // 输出: 123
```

#### 7.2 实例方法引用

```java
String str = "Hello";
Supplier<Integer> strLength = str::length;
System.out.println(strLength.get());  // 输出: 5
```

#### 7.3 特定对象的实例方法引用

```java
Function<String, Integer> stringLength = String::length;
System.out.println(stringLength.apply("Lambda"));  // 输出: 6
```

#### 7.4 构造器引用

```java
Supplier<ArrayList<String>> newList = ArrayList::new;
ArrayList<String> list = newList.get();
System.out.println(list);
```

### 8. Lambda表达式与并行流

Lambda表达式与并行流结合使用,可以利用多核处理器的并行计算能力,提高程序性能。

```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream()
                 .filter(x -> x % 2 == 0)
                 .mapToInt(Integer::intValue)
                 .sum();
System.out.println("Sum of even numbers: " + sum);
```

### 9. Lambda表达式的优缺点

#### 9.1 优点

1. **简洁性**:Lambda表达式使代码更简洁,减少了样板代码。
2. **可读性**:代码更易于阅读和理解。
3. **函数式编程**:支持函数式编程范式,使代码更灵活。
4. **并行处理**:与流API结合使用,能够轻松实现并行计算,提高性能。

#### 9.2 缺点

1. **调试困难**:Lambda表达式中的错误信息可能不如传统代码中的清晰,调试起来可能更困难。
2. **性能开销**:在某些情况下,Lambda表达式可能会引入性能开销,尤其是在频繁创建短生命周期对象时。
3. **学习曲线**:对于不熟悉函数式编程的开发者,可能需要一些时间来学习和掌握Lambda表达式的使用。

### 10. Lambda表达式的注意事项

1. **类型推断**:Lambda表达式依赖于类型推断,编译器会根据上下文推断参数类型。
2. **接口的抽象方法**:Lambda表达式只能用于具有一个抽象方法的接口(函数式接口)。
3. **变量作用域**:Lambda表达式中的局部变量必须是隐式最终(即不能在Lambda表达式外部修改)。
4. **调试与日志**:在Lambda表达式中加入调试和日志代码时,应注意代码的简洁性和可读性。

### 11. 总结

Lambda表达式是Java 8引入的一个重要特性,旨在简化代码,提高可读性和可维护性。通过支持函数式编程,Lambda表达式使Java变得更加灵活和现代化。本文详细介绍了Lambda表达式的基本语法、函数式接口、常用函数式接口、集合框架中的应用、方法引用、并行流以及Lambda表达式的优缺点和注意事项。

通过深入理解和掌握Lambda表达式,开发者可以编写出更简洁、高效和易维护的代码。在实际开发中,合理使用Lambda表达式和流API,可以显著提升代码的质量和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高性能服务器】多线程并发模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​​ 对于常见的C/…

ROS2使用Python开发动作通信

1.创建接口节点 cd chapt4_ws/ ros2 pkg create robot_control_interfaces --build-type ament_cmake --destination-directory src --maintainer-name "joe" --maintainer-email "1027038527qq.com" mkdir -p src/robot_control_interfaces/action touch…

跨模型知识融合:大模型的知识融合

大模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&#…

深度学习之图神经网络GraphSAGE

GraphSAGE(Graph Sample and Aggregate)是图神经网络(GNN)的一种变体,由斯坦福大学的研究人员在 2017 年提出。GraphSAGE 的设计旨在高效处理大规模图数据,并在半监督学习任务中表现出色。它通过采样和聚合邻居节点的信息来学习节点的表示(embeddings),与传统的图神经…

LeetCode Top 100 题目概览及部分题目解答【两数之和,接雨水,最长回文子串,三数之和】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

django开源电子文档管理系统_Django简介、ORM、核心模块

Django简介 Django是一种开源的大而且全的Web应用框架&#xff0c;是由python语言来编写的。他采用了MVC模式&#xff0c;Django最初是被开发来用于管理劳伦斯出版集团下的一些以新闻为主内容的网站。一款CMS(内容管理系统)软件。并于 2005 年 7 月在 BSD 许可证下发布。这套框…

Pytest+Yaml+Request+Allure+PyMsql+Jenkins+GitLab框架源代码之(二)config配置

config公共配置包 config.yml 公共配置文件&#xff0c;主要配置路径及日志 base:base_info_url: https://XXXX.combase_php_url: http://XXXX.combase_weixin_url: https://XXXX.qq.combase_fenmi_url: http://XXXXX.com # base_czt_url: http://XXXXXbase_czt_url: hhttps:…

自然语言处理:第四十章 如何与大模型交流-Prompt工程

文章链接:Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4 主页: VILA-Lab/ATLAS: A principled instruction benchmark on formulating effective queries and prompts for large language models (LLMs). Our paper: https://arxiv.org/abs…

PyCharm 2024.1简介

PyCharm 2024.1 是JetBrains公司发布的Python集成开发环境&#xff08;IDE&#xff09;的最新版本。作为一个深受开发者欢迎的工具&#xff0c;PyCharm以其强大的功能和高效的开发体验著称。以下是PyCharm 2024.1的主要特性和改进&#xff1a; 1. **性能提升**&#xff1a; …

Java 并发 - ThreadLocal详解

ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突, 线程本地存储是一种自动化机制&#xff0c;可以为使用相同变量的每个不同线程都创建不同的存储。 立刀旁 目录 # 带着BAT大厂的面试问题去理解 # ThreadLocal简介 # ThreadLocal理解 # ThreadLocal原理 # 如…

Redis 7.x 系列【13】数据类型之地理位置(Geospatial)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 GEOADD2.2 GEODIST2.3 GEORADIUS2.4 GEOPOS2.5 GEORADIUSBYMEM…

半导体工艺的完美搭档 —— PEEK晶片夹

PEEK&#xff08;聚醚醚酮 Polyetheretherketone&#xff09;是一种高性能的工程塑料&#xff0c;以其耐高温、耐磨性、尺寸稳定性、低释气性和低吸湿性等特性&#xff0c;在电子半导体、光伏及液晶光电工业中得到广泛应用。 PEEK晶片夹作为其中的一种应用&#xff0c;具有以下…

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速&#xff0c;但是大多数液压件生产企业规模小、自主创新能力不足&#xff0c;大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制&#xff0c;高端液压件产品研发生产水平不足&#xff0c;无法形成有效的供给&a…

如何在工作中应用六西格玛绿带培训所学的知识和技能?

近年来&#xff0c;六西格玛作为一种被广泛认可的质量管理工具&#xff0c;为企业提供了一种系统的、数据驱动的方法来优化流程、提高产品质量并减少成本。然而&#xff0c;仅仅接受培训是不够的&#xff0c;如何在工作中有效应用六西格玛绿带培训所学的知识和技能&#xff0c;…

力扣爆刷第1567之TOP100五连刷51-55(滑动窗口、零钱兑换、最小覆盖子串)

力扣爆刷第1567之TOP100五连刷51-55&#xff08;滑动窗口、零钱兑换、最小覆盖子串&#xff09; 文章目录 力扣爆刷第1567之TOP100五连刷51-55&#xff08;滑动窗口、零钱兑换、最小覆盖子串&#xff09;一、239. 滑动窗口最大值二、41. 缺失的第一个正数三、LCR 140. 训练计划…

录屏软件哪个好用?分享5款(2024最新)

随着网络时代的发展&#xff0c;电脑的使用频率也越来越高&#xff0c;还有近些年出现的网课、直播等&#xff0c;这让电脑的录屏功能显得更重要。随之而来的录屏软件也越来越多样化&#xff0c;选择一款好的软件是录屏至关重要的环节。 在数字浪潮汹涌的时代&#xff0c;录屏…

前端利用vue如何实现导入和导出功能.md

1. 前端利用vue如何实现导入和到处功能 1.1. 导入功能&#xff08;以导入Excel文件为例&#xff09; 1.1.1. 实现步骤: 1.1.1.1. 安装依赖: 首先&#xff0c;你需要安装处理Excel文件的库&#xff0c;如xlsx。1.1.1.2. 创建上传组件: 使用Element UI的<el-upload>组件或其…

【JavaScript脚本宇宙】从发票生成到网页保存:JavaScript PDF库指南

探索顶级JavaScript PDF库&#xff1a;高效处理PDF文档的利器 前言 随着数字化信息的普及和无纸化办公理念的深入&#xff0c;PDF文档因其高度兼容性和稳定性成为了存储、分享和展示信息的首选格式。为了满足不同用户对PDF文档生成和处理的需求&#xff0c;各类功能强大的Jav…

绘唐3一键追爆款文刻创作聚星文社

聚星文社是一个中国的文学社交平台&#xff0c;提供了一个让作家和读者相互交流和分享作品的平台。 在聚星文社&#xff0c;作家可以在平台上发布自己的作品&#xff0c;获得读者的阅读和评论&#xff0c;同时也可以与其他作家进行交流与学习。 点击下载即可 读者可以在平台上…

用质因数求解最大公约数(gcd)和最小公倍数(lcm)

用质因数求解最大公约数&#xff08;gcd&#xff09; 思路分析&#xff1a; 1、质因数&#xff1a;(素因数或质因子)他指的是能整除给定正整数的质数。例如&#xff1a;36可以分解为223*3&#xff0c;其中2和3就是质因数。 2、质因数求解最大公约数&#xff1a; 对每个数进行…