Java Lambda表达式:简化编程,提高效率

Java Lambda表达式:简化编程,提高效率

    • 1. 使用Lambda表达式进行集合遍历
      • 1.1 未使用Lambda表达式:
      • 1.2 使用Lambda表达式:
    • 2. 使用Lambda表达式进行排序
      • 2.1 未使用Lambda表达式:
      • 2.2 使用Lambda表达式:
    • 3. 使用Lambda表达式进行过滤
      • 3.1 未使用Lambda表达式:
      • 3.2 使用Lambda表达式:
    • 4. 使用Lambda表达式进行映射
      • 4.1 未使用Lambda表达式:
      • 4.2 使用Lambda表达式:
    • 5. 使用Lambda表达式进行归约
      • 5.1 未使用Lambda表达式:
      • 5.2 使用Lambda表达式:
    • 6. 使用Lambda表达式进行分组
      • 6.1 未使用Lambda表达式:
      • 6.2 使用Lambda表达式:
    • 源码
    • 7. 使用Lambda表达式进行函数式接口的实现
      • 7.1 未使用Lambda表达式:
      • 7.2 使用Lambda表达式:
    • 8. 使用Lambda表达式进行线程的创建
      • 8.1 未使用Lambda表达式:
      • 8.2 使用Lambda表达式:
    • 9. 使用Lambda表达式进行Optional的操作
      • 9.1 未使用Lambda表达式:
      • 9.2 使用Lambda表达式:
    • 10. 使用Lambda表达式进行Stream的流水线操作
      • 10.1 未使用Lambda表达式:
      • 10.2 使用Lambda表达式:

在这里插入图片描述

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨

理解了,我将添加更多的案例,其中将包括对比使用Lambda表达式和不使用Lambda表达式的情况,以便更全面地展示Lambda表达式的优势。让我们开始扩展这个内容吧:

1. 使用Lambda表达式进行集合遍历

1.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
for (String fruit : list) {System.out.println(fruit);
}

1.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(fruit -> System.out.println(fruit));

Lambda表达式的使用使得集合遍历更为简洁,消除了传统for循环中的冗余代码,提升了代码的可读性和简洁性。

2. 使用Lambda表达式进行排序

2.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
Collections.sort(list, new Comparator<String>() {public int compare(String s1, String s2) {return s1.compareTo(s2);}
});

2.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
Collections.sort(list, (s1, s2) -> s1.compareTo(s2));

Lambda表达式的引入简化了排序操作的代码量,使得代码更加紧凑、易读。

3. 使用Lambda表达式进行过滤

3.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = new ArrayList<String>();
for (String fruit : list) {if (fruit.startsWith("a")) {filteredList.add(fruit);}
}

3.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = list.stream().filter(fruit -> fruit.startsWith("a")).collect(Collectors.toList());

Lambda表达式简化了过滤操作,使得代码更加清晰明了,减少了中间变量的使用。

4. 使用Lambda表达式进行映射

4.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<Integer> lengths = new ArrayList<Integer>();
for (String fruit : list) {lengths.add(fruit.length());
}

4.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<Integer> lengths = list.stream().map(fruit -> fruit.length()).collect(Collectors.toList());

Lambda表达式使得映射操作更加简洁明了,减少了循环代码的编写。

5. 使用Lambda表达式进行归约

5.1 未使用Lambda表达式:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int i : list) {sum += i;
}

5.2 使用Lambda表达式:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);

Lambda表达式的引入使得归约操作更为简单,减少了冗余的循环代码,提高了代码的可读性和简洁性。

以上是对常见操作的Lambda表达式应用,接下来我们将继续探讨Lambda表达式在其他方面的应用,包括函数式接口的实现、线程创建、Optional的操作以及Stream的流水线操作。

6. 使用Lambda表达式进行分组

6.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
Map<Integer, List<String>> grouped = new HashMap<Integer, List<String>>();
for (String fruit : list) {int length = fruit.length();if (!grouped.containsKey(length)) {grouped.put(length, new ArrayList<String>());}grouped.get(length).add(fruit);
}

6.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
Map<Integer, List<String>> grouped = list.stream().collect(Collectors.groupingBy(String::length));

Lambda表达式使得分组操作更加简洁,通过方法引用或Lambda表达式,能够直接传递业务逻辑,减少了样板代码的编写。

源码

package com.example.java;import java.util.*;
import java.util.stream.Collectors;public class lamdba {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");//todo---------------------------------------------------//1.集合遍历for (String s : list) {System.out.println("普通编码==》" + s);}list.forEach(s -> System.out.println("Lambda遍历==》" + s));//2.排序// 使用 Collections.sort() 方法对列表 list 进行排序Collections.sort(list, new Comparator<String>() {// 创建匿名内部类实现 Comparator 接口,并重写 compare 方法@Overridepublic int compare(String o1, String o2) {// 比较两个字符串 o1 和 o2 的字典顺序(升序)return o1.compareTo(o2);}});// 输出排序后的列表System.out.println("普通排序:" + list);Collections.sort(list, (s1, s2) -> s1.compareTo(s2));System.out.println("Lambda排序:" + list);//3.过滤// 创建一个新的列表 filteredList,用于存储过滤后的字符串List<String> filteredList = new ArrayList<String>();// 使用增强型 for 循环遍历原始列表 list 中的每个元素for (String s : list) {// 检查当前字符串 s 是否以字母 "a" 开头if (s.startsWith("a")) {// 如果是以 "a" 开头,则将其添加到过滤后的列表 filteredList 中filteredList.add(s);}}// 输出过滤后的列表内容System.out.println("普通过滤:" + filteredList);// 使用流式处理和 Lambda 表达式过滤原始列表 list 中以字母 "b" 开头的字符串List<String> filtered = list.stream().filter(fruit -> fruit.startsWith("b")) // 使用 filter() 方法过滤符合条件的元素.collect(Collectors.toList()); // 将过滤后的结果收集到新的列表中// 输出 Lambda 过滤后的列表内容System.out.println("Lambda过滤:" + filtered);//4.映射List<Integer> lengths = new ArrayList<Integer>();for (String s : list) {lengths.add(s.length());}System.out.println("普通映射:" + lengths);// 使用流式处理将原始列表 list 中的字符串转换为它们的长度,并收集到新的整数列表中List<Integer> length = list.stream()                // 将列表转换为一个流.map(fruit -> fruit.length())   // 使用 map() 方法将每个字符串映射为其长度.collect(Collectors.toList());  // 将映射后的长度收集到一个新的整数列表中System.out.println("Lambda映射:" + lengths);List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);//5.归约int sum = 0;for (int i : list1) {sum += i;}System.out.println("普通归约" + sum);// 使用流式处理将列表 list 中的所有元素进行求和操作int sum1 = list1.stream()                   // 将列表转换为一个流.reduce(0, (a, b) -> a + b); // 使用 reduce() 方法对流中的元素进行累加求和,初始值为 0System.out.println("Lambda归约" + sum1);//6.分组// 创建一个 HashMap,用于按字符串长度将列表 list 中的字符串分组Map<Integer, List<String>> grouped = new HashMap<Integer, List<String>>();// 遍历列表 list 中的每个字符串for (String s : list) {// 获取当前字符串 s 的长度int lengths1 = s.length();// 如果 grouped 中不包含当前长度,则添加一个新的列表if (!grouped.containsKey(lengths1)) {grouped.put(lengths1, new ArrayList<String>());}// 将当前字符串 s 加入到对应长度的列表中grouped.get(lengths1).add(s);}// 输出普通分组结果System.out.println("普通分组:" + grouped);// 使用流式处理将列表 list 中的字符串按照它们的长度进行分组,并收集到一个新的 Map 中Map<Integer, List<String>> groupeds = list.stream()   // 将列表转换为一个流.collect(Collectors.groupingBy(fruit -> fruit.length())); // 使用 groupingBy() 方法按字符串长度进行分组System.out.println("Lambda分组:" + groupeds);}
}

执行结果

普通编码==》apple
普通编码==》orange
普通编码==》banana
Lambda遍历==》apple
Lambda遍历==》orange
Lambda遍历==》banana
普通排序:[apple, banana, orange]
Lambda排序:[apple, banana, orange]
普通过滤:[apple]
Lambda过滤:[banana]
普通映射:[5, 6, 6]
Lambda映射:[5, 6, 6]
普通归约15
Lambda归约15
普通分组:{5=[apple], 6=[banana, orange]}
Lambda分组:{5=[apple], 6=[banana, orange]}

7. 使用Lambda表达式进行函数式接口的实现

7.1 未使用Lambda表达式:

public interface MyInterface {public void doSomething(String input);
}MyInterface myObject = new MyInterface() {public void doSomething(String input) {System.out.println(input);}
};
myObject.doSomething("Hello World");

7.2 使用Lambda表达式:

MyInterface myObject = input -> System.out.println(input);
myObject.doSomething("Hello World");

Lambda表达式使得函数式接口的实现更加简洁,通过箭头操作符直接定义了函数的行为,减少了接口实现类的创建。

8. 使用Lambda表达式进行线程的创建

8.1 未使用Lambda表达式:

Thread thread = new Thread(new Runnable() {public void run() {System.out.println("Thread is running.");}
});
thread.start();

8.2 使用Lambda表达式:

Thread thread = new Thread(() -> System.out.println("Thread is running."));
thread.start();

Lambda表达式简化了线程的创建过程,使得代码更为紧凑、易读。

9. 使用Lambda表达式进行Optional的操作

9.1 未使用Lambda表达式:

String str = "Hello World";
if (str != null) {System.out.println(str.toUpperCase());
}

9.2 使用Lambda表达式:

Optional<String> str = Optional.ofNullable("Hello World");
str.map(String::toUpperCase).ifPresent(System.out::println);

Lambda表达式使得对Optional对象的操作更加直观,通过链式调用的方式简化了代码的编写。

10. 使用Lambda表达式进行Stream的流水线操作

10.1 未使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = new ArrayList<String>();
for (String fruit : list) {if (fruit.startsWith("a")) {filteredList.add(fruit.toUpperCase());}
}
Collections.sort(filteredList);

10.2 使用Lambda表达式:

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = list.stream().filter(fruit -> fruit.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());

Lambda表达式简化了Stream流水线操作的代码,使得代码更为清晰、易读。

通过以上对比,我们可以清晰地看到Lambda表达式相比传统方式的优势,它使得代码更为简洁、可读,提高了编程效率。

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

精通C语言:打造高效便捷的通讯录管理系统

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言项目 贝蒂的主页&#xff1a;Betty‘s blog 引言 在我们大致学习完C语言之后&#xff0c;我们就可以利用目前所学的知识去…

HCIA-HarmonyOS设备开发认证V2.0-内核扩展组件

目录 一、CPU 占用率1.1、CPU 占用率基本概念1.2、CPU 占用率运行机制1.3、CPU 占用率开发流程 二、动态加载2.1、 动态加载基本概念2.2、动态加载运行机制 坚持就有收获 一、CPU 占用率 1.1、CPU 占用率基本概念 CPU&#xff08;中央处理器&#xff0c;Central Processing U…

第三节作业:基于 InternLM 和 LangChain 搭建你的知识库

参考文档&#xff1a;https://github.com/InternLM/tutorial/tree/main/langchain 基础作业&#xff1a;复现课程知识库助手搭建过程 (截图) 1.环境配置 2.知识库搭建 &#xff08;1&#xff09;数据收集 收集由上海人工智能实验室开源的一系列大模型工具开源仓库作为语料库来…

单html页面使用Vue3和Element-Plus

快速入门&#xff08;直接整案例&#xff0c;看显示效果&#xff09; 使用CDN方式引入Vue3使用CDN方式引入Element-Plus的样式文件和组件库 案例1&#xff08;按钮&#xff0c;表格&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta …

人工智能时代

一、人工智能发展历史:从概念到现实 人工智能(Artificial Intelligence,简称AI)是计算机科学领域中一门旨在构建能够执行人类智能任务的系统的分支。其发展历程充满曲折,从概念的提出到如今的广泛应用,是技术、理论和实践相互交织的产物。 1. 起源(20世纪中期) 人工智…

对称密钥密码体制、公钥密码体制

1 对称密钥密码体制 加密密钥与解密密钥都使用相同密钥的密码体制。 数据加密标准 DES DES 属于对称密钥密码体制&#xff0c;是一种分组密码。 在加密前&#xff0c;先对整个明文进行分组。每一个组长为 64 位。 然后对每一个 64 位 二进制数据进行加密处理&#xff0c;…

云计算基础-华为存储实验

存储配置流程 创建硬盘域&#xff08;CK&#xff0c;包括热备CK&#xff09;创建存储池&#xff08;CKG、Extent&#xff09;创建LUN、LUN组、将LUN加入LUN组创建主机、主机组、将主机加入主机组创建映射视图&#xff08;LUN组和主机组的映射&#xff09; 1. 创建CK 创建硬盘…

【数据结构】二叉查找树和平衡二叉树,以及二者的区别

目录 1、二叉查找树 1.1、定义 1.2、查找二叉树的优点 1.2、查找二叉树的弊端 2、平衡二叉树 2.1、定义 2.2、 实现树结构平衡的方法&#xff08;旋转机制&#xff09; 2.2.1、左旋 2.2.2、右旋 3、总结 1、二叉查找树 二叉查找树又名二叉排序树&#xff0c;亦称二叉搜…

究极小白如何自己搭建一个自动发卡网站-独角数卡

本人从来没接触过建站&#xff0c;我之前都是在TB上花90叫别人给我搭建的网站&#xff0c;前几天这个TB店倒闭跑路了&#xff0c;而我的发卡网也打不开了&#xff0c;没办法&#xff0c;逼上梁山&#xff0c;自己捣鼓出来了&#xff01;下面是2023/4/2自己建好的&#xff01; …

租用一个服务器需要多少钱?2024阿里云新版报价

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

网络安全问题概述

1 计算机网络面临的安全性威胁 两大类威胁&#xff1a;被动攻击和主动攻击。 被动攻击 指攻击者从网络上窃听他人的通信内容。 通常把这类攻击称为截获。 攻击者只是观察和分析某一个协议数据单元 PDU&#xff0c;以便了解所交换的数据的某种性质&#xff0c;但不干扰信息…

AI Infra论文阅读之LIGHTSEQ(LLM长文本训练的Infra工作)

感觉这篇paper有几个亮点&#xff0c;首先把Megatron-LM的Self-Attention模块的模型并行方式变成序列并行&#xff0c;优化了通信量&#xff0c;同时通过计算和通信重叠近一步压缩了训练迭代时间。另外&#xff0c;在使用重计算的时候发现当前Huggingface/Megatron-LM的重计算策…

vue3 之 商城项目—支付

支付模版 pay/index.vue <script setup> const payInfo {} </script> <template><div class"xtx-pay-page"><div class"container"><!-- 付款信息 --><div class"pay-info"><span class"ic…

嵌入式Qt Qt中的字符串类

一.Qt中的字符串类 QString vs string&#xff1a; QString在Qt库中几乎是无所不在的 所有的Qt图形用户组件都依赖于QString 实验1 &#xff1a;QString 初体验 #include <QDebug> void Sample_1() {QString s "add";s.append(" "); // &q…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接&#xff1a;Codeforces Round 926 (Div. 2) B题传送门&#xff1a;B. Sasha and the Drawing 题目&#xff1a;B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

基于结点电压法的配电网状态估计算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 结点电压法的基本原理 4.2 结点电压法在配电网状态估计中的应用 5.完整程序 1.程序功能描述 基于结点电压法的配电网状态估计算法.对配电网实施有效控制和操作的前提是实时数据库中数据…

【JavaEE】_Fiddler抓包HTTP请求与响应

目录 1. Fiddler简介 2. Fiddler安装步骤 3. 抓包结果举例&#xff08;sogou.com&#xff09; 1. Fiddler简介 1. 要查看HTTP的请求和响应&#xff0c;需要使用抓包工具进行抓包&#xff1b; 抓包即获取网卡上经过的数据并显示出来&#xff0c;常用的抓包工具有wireshark和…

BIOS and UEFI

BIOS : Basic Input/Output System UEFI: Unified Extensible Firmware Interface Notes: 1. 两者都是主板上的firmware. 2. 两者的作用都包括开机后检查硬件&#xff0c;从硬盘上寻找bootloader(用于加载操作系统&#xff0c;例如GRUB). # 操作系统的启动过程&#xff1a…

linux中的文件操作

linux的理念 在linux中的一切皆为文件&#xff01;&#xff01;&#xff01; 在上一篇博客中提到过&#xff0c;Linux中的桌面本质上也是一种文件&#xff0c;而现在&#xff0c;在本篇博客中要对这种理念进行进一步的提升&#xff0c;也就是在Linux系统中的一切皆为文件&#…

数据结构对链表的初步认识(一)

已经两天没有更新了&#xff0c;今天就写一篇数据结构的链表吧&#xff0c;巩固自己也传授知识&#xff0c;不知道各位是否感兴趣看看这一篇有关联表的文章。 目录 链表的概念与结构 单向链表的实现 链表各个功能函数 首先我在一周前发布了一篇有关顺序表的文章&#xff0c;…