# 开发趋势 Java Lambda 表达式 第三篇

news2024/10/3 16:15:05

开发趋势 Java Lambda 表达式 第三篇

在这里插入图片描述

一,Lambda 整合集合+常规操作

List

Java Lambda 表达式可以与List集合和常规操作进行整合,以提供一种更简洁、更可读的代码编写方式。以下是几个示例:

  1. 集合遍历操作:
List<String> names = Arrays.asList("John", "Mary", "Alice");

// 使用 foreach 循环遍历
names.forEach(name -> System.out.println(name));

// 使用 Stream API 进行遍历
names.stream().forEach(name -> System.out.println(name));
  1. 常规操作:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用 reduce 方法求和
int sum = numbers.stream()
                 .reduce(0, (num1, num2) -> num1 + num2);
System.out.println(sum);

// 使用 filter 方法过滤元素
List<Integer> evenNumbers = numbers.stream()
                                   .filter(number -> number % 2 == 0)
                                   .collect(Collectors.toList());
System.out.println(evenNumbers);

// 使用 map 方法对元素进行映射操作
List<String> names = numbers.stream()
                            .map(number -> "Name" + number)
                            .collect(Collectors.toList());
System.out.println(names);

Map

Lambda 表达式允许程序员在不需要编写冗长代码的情况下进行更复杂的操作。而与集合和常规操作相结合,使用 Lambda 表达式可以使代码更加简洁、可维护和易读,并且可以提高生产力。

使用 Lambda 表达式和 Map 集合结合,可以实现对集合中元素的映射、过滤、聚合等常规操作。以下是几个示例:

  1. 遍历 Map 集合:
Map<String, Integer> scores = new HashMap<>();
scores.put("John", 90);
scores.put("Mary", 80);
scores.put("Alice", 85);

// 遍历 Map 的键值对
scores.forEach((name, score) -> System.out.println(name + " : " + score));

// 遍历 Map 的键
scores.keySet().forEach(key -> System.out.println(key));

// 遍历 Map 的值
scores.values().forEach(value -> System.out.println(value));
  1. 过滤操作:
Map<String, Integer> scores = new HashMap<>();
scores.put("John", 90);
scores.put("Mary", 80);
scores.put("Alice", 85);

// 过滤出分数大于 85 的元素
Map<String, Integer> filteredScores = scores.entrySet()
                                            .stream()
                                            .filter(entry -> entry.getValue() > 85)
                                            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(filteredScores);
  1. 映射操作:
Map<String, Integer> scores = new HashMap<>();
scores.put("John", 90);
scores.put("Mary", 80);
scores.put("Alice", 85);

// 将每个分数增加 5 分
Map<String, Integer> updatedScores = scores.entrySet()
                                           .stream()
                                           .map(entry -> {
                                               entry.setValue(entry.getValue() + 5);
                                               return entry;
                                           })
                                           .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(updatedScores);
  1. 聚合操作:
Map<String, Integer> scores = new HashMap<>();
scores.put("John", 90);
scores.put("Mary", 80);
scores.put("Alice", 85);

// 计算所有分数的平均值
double averageScore = scores.values()
                            .stream()
                            .mapToInt(Integer::intValue)
                            .average()
                            .orElse(0);

System.out.println(averageScore);

通过使用 Lambda 表达式与 Map 集合相结合,可以以更简洁、流畅的方式对集合中的元素进行操作。我们可以使用 forEach 方法遍历 Map 的键值对或键/值;使用 filter 方法过滤出符合条件的元素;使用 map 方法对元素进行映射操作;使用 reduce 或聚合方法对元素进行汇总等操作。这种结合可以帮助我们更高效地处理 Map 集合中的数据。

Set

使用 Lambda 表达式和 Set 集合结合,可以实现对集合中元素的映射、过滤、聚合等常规操作。以下是几个示例:

  1. 遍历 Set 集合:
Set<String> names = new HashSet<>();
names.add("John");
names.add("Mary");
names.add("Alice");

// 使用 forEach 遍历 Set
names.forEach(name -> System.out.println(name));

// 使用 Stream API 进行遍历
names.stream().forEach(name -> System.out.println(name));
  1. 过滤操作:
Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);

// 过滤出偶数元素
Set<Integer> evenNumbers = numbers.stream()
                                   .filter(number -> number % 2 == 0)
                                   .collect(Collectors.toSet());
System.out.println(evenNumbers);
  1. 映射操作:
Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);

// 将每个元素乘以 2
Set<Integer> mappedNumbers = numbers.stream()
                                     .map(number -> number * 2)
                                     .collect(Collectors.toSet());

System.out.println(mappedNumbers);
  1. 聚合操作:
Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);

// 计算所有元素的和
int sum = numbers.stream().reduce(0, (num1, num2) -> num1 + num2);
System.out.println(sum);

通过使用 Lambda 表达式与 Set 集合相结合,可以以更简洁、流畅的方式对集合中的元素进行操作。我们可以使用 forEach 方法遍历 Set;使用 filter 方法过滤出符合条件的元素;使用 map 方法对元素进行映射操作;使用 reduce 或聚合方法对元素进行汇总等操作。这种结合可以帮助我们更高效地处理 Set 集合中的数据。

Lambda 表达式的局限性

尽管 Lambda 表达式提供了一种简洁、灵活的编程方式,但也存在一些局限性。以下是 Lambda 表达式的一些局限性:

  1. 必须满足函数接口要求:Lambda 表达式必须与函数接口(只有一个抽象方法的接口)相匹配。这意味着 Lambda 表达式不能用于任意的方法或任意的接口。

  2. 缺乏可读性:过于复杂的 Lambda 表达式可能降低代码的可读性。当 Lambda 表达式变得很长或包含复杂逻辑时,可读性可能会受到影响。

  3. 无法使用非 final 变量:在 Lambda 表达式中使用的局部变量必须是 final 或 effectively final(在变量声明后不再修改)。这是因为 Lambda 表达式捕获变量时实际上是创建了一个新的变量副本,并且这个副本必须保持不可变。

  4. 不支持跳出多层嵌套循环:Lambda 表达式内部无法使用 break 或 continue 关键字跳出多层嵌套循环。它只能在当前循环内部进行断言。

  5. 难以调试:相对于传统的方法和类,Lambda 表达式的调试可能会更加困难。由于 Lambda 表达式是匿名函数,调试时可能难以追踪和定位问题。

  6. 可能引发性能问题:虽然 Lambda 表达式提供了便利的语法,但在某些情况下可能导致性能问题。Lambda 表达式会引入额外的开销,尤其是在需要进行大量迭代或频繁调用时。

尽管存在这些局限性,Lambda 表达式仍然是 Java 8 引入的重要特性,可以帮助我们编写更简洁、易读的代码,并促进函数式编程思想的应用。对于大多数常规的编程任务,Lambda 表达式仍然是一种强大而实用的工具。

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

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

相关文章

PI证书导入总结

当我们在用pi调用https的方式时&#xff0c;接口会报错提示iaik.security.ssl.SSLCertificateException。这需要我们导入对应的证书。 一.下载证书 根据对方提供的url &#xff0c;在浏览器中输入&#xff0c;点击锁头图标&#xff0c;点击证书信息 二.点击详细信息标签&…

【蓝桥每日一题]-动态规划 (保姆级教程 篇11)#方格取数2.0 #传纸条

目录 题目&#xff1a;方格取数 思路&#xff1a; 题目&#xff1a;传纸条 思路&#xff1a; 题目&#xff1a;方格取数 &#xff08;跑两次&#xff09; 思路&#xff1a; 如果记录一种方案后再去跑另一个方案&#xff0c;影响因素太多了&#xff0c;所以两个方案要同时开…

Mysql数据库 3.SQL语言 DML数据操纵语言 增删改

DML语句&#xff1a;用于完成对数据表中数据的插入、删除、修改操作 一.表数据插入 插入数据语法&#xff1a; 步骤例&#xff1a; 1.声明数据库&#xff1a;use 数据库名; 2.删除操作&#xff1a;drop table if exists 表名; 3.创建数据库中的表&#xff1a;create table 表…

企业云网盘:如何选择最适合您的解决方案?

企业日常办公每天都会产出大量的文件&#xff0c;如何安全管理文件&#xff1f;企业如何进行高效的文件的共享&#xff1f;企业云网盘产品为企业提供了一个文件解决方案&#xff0c;其安全便捷的特点已成为文件数据管理的热门之选。然而越来越多的品牌进入了企业云网盘市场&…

C++ 学习 之 名字空间 namespace

必须在模块里面 extern 声明 在一个 cpp 文件中&#xff0c; 一个namespace 可以多次定义&#xff0c;最后合并&#xff0c;使用 using namespace A 这种引入方式的话&#xff0c;使用的时候可以用所有 A 中的数据 多个 cpp 文件的话&#xff0c;不能会自动合并相同的 名字空…

【双向链表的插入和删除】

文章目录 双向链表双向链表的插入双向链表的删除操作 双向链表 双向链表的结构定义如下&#xff1a; //双向链表的结构定义 typedef struct DuLNode {ElemType data;struct DuLNode* prior, * next; }DuLNode,*DuLinkList;双向链表的结点有两个指针域&#xff1a;prior&#…

【带你找回童年的快乐,Python实现坦克大战】

文章目录 前言&#xff1a;第一步&#xff1a;安装Pygame库第二步&#xff1a;实现思路&#xff1a;场景实现&#xff1a;石头墙&#xff1a;钢墙&#xff1a;地面类&#xff08;Grass&#xff09;地图&#xff1a; 第三步&#xff1a;坦克类的详细实现&#xff1a;坦克类&…

国际刑事法院系统遭网络间谍攻击

导语&#xff1a;国际刑事法院&#xff08;ICC&#xff09;近日披露&#xff0c;其系统遭受了一次网络间谍攻击。这次攻击被认为是有目的的&#xff0c;旨在进行间谍活动。作为一个国际法庭&#xff0c;ICC的总部设在荷兰海牙&#xff0c;其职责是调查并追究犯下国际社会关注的…

微机原理与接口技术-第七章输入输出接口

文章目录 I/O接口概述I/O接口的典型结构基本功能 I/O端口的编址独立编址统一编址 输入输出指令I/O寻址方式I/O数据传输量I/O保护 16位DOS应用程序DOS平台的源程序框架DOS功能调用 无条件传送和查询传送无条件传送三态缓冲器锁存器接口电路 查询传送查询输入端口查询输出端口 中…

【Linux系统编程】命令模式2

目录 一&#xff0c;Linux下的初阶认识 1&#xff0c;管道 2&#xff0c;时间戳 二&#xff0c;Liunx系统命令操作 1&#xff0c;date时间指令 2&#xff0c;cal日历指令 3&#xff0c;which和find查找指令 3-1&#xff0c;which指令&#xff1a; 3-2&#xff0c;find…

c语言一维数组和二维指针

c语言一维数组和二维指针&#xff1a;测试目的&#xff0c;了解二维指针赋值。 #include <stdio.h> //c语言一维数组和二维指针 int main(int argc,char *argv[]) { int MyArray[2]; int *p1; int **p2; //int **p2&p1;//在声明变量时&#xff0c;可以这么赋值 …

如何保养维护实验室超声波清洗机

实验室是用于各个行业产品的研发以及检验的场所&#xff0c;所以对其中所使用的各种物品都有着极高的要求&#xff0c;因此只有品类齐全的实验室超声波清洗机能够满足实验室对于清洁以及其他方面的一些需求&#xff0c;但是要想实验室超声波清洗机设备的性能能够始终如一&#…

后 Cookie 时代如何实现精准的用户运营与管理?

Cookie 时代的营销&#xff1a;用隐私换取个性化服务方式帮助他们找到回家的路。而在数字世界中&#xff0c;网站运营者可以通过这些“碎饼干屑 &#xff08;Cookie&#xff09;”追踪用户行为。 用户隐私和个性化服务之间的平衡一直是一个备受争议的话题。随着技术的发展&…

二叉排序树(BST)

二叉排序树 基本介绍 二叉排序树创建和遍历 class Node:"""创建 Node 节点"""value: int 0left Noneright Nonedef __init__(self, value: int):self.value valuedef add(self, node):"""添加节点node 表示要添加的节点&quo…

Your password has expired. To log in you must change it using a client that

早上打开本地mysql链接报错了&#xff0c;提示密码过期 PS:是密码过期&#xff0c;不是密码错误 开始 先看下mysql安装位置 windowsD 打开运行窗口 输入 services.msc 打开服务界面 找到mysql 查看安装路径 windowsD 打开运行窗口 cmd 进入mysql bin 目录 1、cd 你的目…

React 中 keys 的作用是什么?

目录 前言&#xff1a;React 中的 Keys 的重要性 为什么 Keys 重要&#xff1f; 详解&#xff1a;key 属性的基本概念 用法&#xff1a;key 属性的示例 解析&#xff1a;key 属性的优势和局限性 优势&#xff1a; 局限性&#xff1a; key 属性的最佳实践 稳定的唯一标…

ZYNQ linux调试LCD7789

一,硬件管脚 1,参数解释和实物 LVGL是一个开源的图形库,主要用于MCU上屏幕UI的部署,功能完善,封装合理,可裁切性强,也可以实现Linux上fbx的部署。LVGL官网LVGL - Light and Versatile Embedded Graphics Library 每根线的作用

[Linux 基础] make、Makefile自动化构建代码工具

文章目录 1、make与Makefile是什么2、为什么要有make与Makefile3、怎么实现一个Makefile文件3.1 如何编写Makefile文件3.1.1 依赖关系3.1.2 依赖方法 3.2 如何清理项目3.2.1 如何编写3.2.2 clean详解 3.3 make的使用3.4 原理3.4.1 查看文件修改时间 1、make与Makefile是什么 m…

0基础学习VR全景平台篇第110篇:源图像导入和镜头预设 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 本节教程&#xff0c;我们讲述拼接软件 PTGui Pro 操作的第一步&#xff1a;导入源图像和预设镜头&画幅参数。 我们此次课堂有两个重点&#xff1a; 第一点是 培养摄影后期…

拼团小程序制作技巧大揭秘:零基础也能轻松掌握

随着拼团模式的日益流行&#xff0c;越来越多的商家和消费者开始关注拼团小程序的制作。对于没有技术背景的普通人来说&#xff0c;制作一个拼团小程序似乎是一项艰巨的任务。但实际上&#xff0c;选择一个简单易用的第三方平台或工具&#xff0c;可以轻松完成拼团小程序的制作…