常用的Lambda表达式案例解析,工作中都会用到!

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢我们日常工作中,Lambda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码接下来我们把 Lambda 流的常用方法用案列讲解一下。ForEach集合的遍历forEach方法Collect将操作后的对象转化为新的对象FilterFilter 为过滤的意思,只要满足 Filter 表达式的数据就可以留下来,不满足的数据被过滤掉Mapmap 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以让

前言

文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/

觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢

我们日常工作中,Lambda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码

接下来我们把 Lambda 流的常用方法用案列讲解一下。


ForEach

集合的遍历forEach方法


public void testForEach(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       list.forEach(s-> System.out.println(s));

   }


Collect

将操作后的对象转化为新的对象

public void testCollect(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("2");

       }};

       //转换为新的list

       List newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());

   }


Filter

Filter 为过滤的意思,只要满足 Filter 表达式的数据就可以留下来,不满足的数据被过滤掉

public void testFilter() {

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};        

     

       list.stream()

               // 过滤掉我们希望留下来的值

               // 表示我们希望字符串是 1 能留下来

               // 其他的过滤掉

               .filter(str -> "1".equals(str))

               .collect(Collectors.toList());

   }


Map

map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B

public void testMap() {

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       //通过 map 方法list中元素转化成 小写

       List strLowerList = list.stream()

               .map(str -> str.toLowerCase())

               .collect(Collectors.toList());

   }


MapToInt

mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了,源码如下:

public void testMapToInt() {

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       list.stream()

               .mapToInt(s->Integer.valueOf(s))

               // 一定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为已经确定是 int 类型了

               // 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以需要使用 mapToObj

               // 方法返回有泛型的流

               .mapToObj(s->s)

               .collect(Collectors.toList());

       list.stream()

               .mapToDouble(s->Double.valueOf(s))

               // DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法

               .sum();

   }


Distinct

distinct 方法有去重的功能

public void testDistinct(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("2");

       }};

       list.stream()

               .map(s -> Integer.valueOf(s))

               .distinct()

               .collect(Collectors.toList());

   }


Sorted

Sorted 方法提供了排序的功能,并且允许我们自定义排序

public void testSorted(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       list.stream()

               .map(s -> Integer.valueOf(s))

               // 等同于 .sorted(Comparator.naturalOrder()) 自然排序

               .sorted()

               .collect(Collectors.toList());

       // 自定义排序器

       list.stream()

               .map(s -> Integer.valueOf(s))

               // 反自然排序

               .sorted(Comparator.reverseOrder())

               .collect(Collectors.toList());

   }


groupingBy

groupingBy 是能够根据字段进行分组,toMap 是把 List 的数据格式转化成 Map 的格式

public void testGroupBy(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("2");

       }};

       Map> strList = list.stream().collect(Collectors.groupingBy(s -> {

           if("2".equals(s)) {

               return "2";

           }else {

               return "1";

           }

       }));

   }


FindFirst

findFirst 表示匹配到第一个满足条件的值就返回

public void testFindFirst(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("2");

       }};

     

       list.stream()

               .filter(s->"2".equals(s))

               .findFirst()

               .get();

     

       // 防止空指针

       list.stream()

               .filter(s->"2".equals(s))

               .findFirst()

               // orElse 表示如果 findFirst 返回 null 的话,就返回 orElse 里的内容

               .orElse("3");

       Optional str= list.stream()

               .filter(s->"2".equals(s))

               .findFirst();

       // isPresent 为 true 的话,表示 value != null

       if(str.isPresent()){

           return;

       }

   }


Reduce

reduce 方法允许我们在循环里面叠加计算值

public void testReduce(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

     

       list.stream()

               .map(s -> Integer.valueOf(s))

               // s1 和 s2 表示循环中的前后两个数

               .reduce((s1,s2) -> s1+s2)

               .orElse(0);

       list.stream()

               .map(s -> Integer.valueOf(s))

               // 第一个参数表示基数,会从 100 开始加

               .reduce(100,(s1,s2) -> s1+s2);

   }


Peek

peek 方法很简单,我们在 peek 方法里面做任意没有返回值的事情,比如打印日志

public void testPeek(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       list.stream().map(s -> Integer.valueOf(s))

               .peek(s -> System.out.println(s))

               .collect(Collectors.toList());

   }


Limit

limit 方法会限制输出值个数,入参是限制的个数大小

public void testLimit(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("3");

       }};

       list.stream()

               .map(s -> Integer.valueOf(s))

               .limit(2L)

               .collect(Collectors.toList());

   }


Max,Min

通过max、min方法,可以获取集合中最大、最小的对象

public void testMaxMin(){

       List list = new ArrayList() {{

           add("1");

           add("2");

           add("2");

       }};

       list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get();

       list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get();

   }


总结


本文我们介绍十几种 Lambda 表达式常用的方法

懂这些,这样你在工作中遇到复杂数据结构转化时,肯定会得心应手了。


最后


欢迎关注公众号:月伴飞鱼

每天分享一篇实用的技术文章,对面试,工作都有帮助

觉得有收获,记得点赞,转发,分享,谢谢

相关文章
|
12天前
|
开发框架 .NET 中间件
.net8 使用 license 证书授权案例解析
本文介绍了如何使用 `.NET CLI` 创建并改造一个 `ASP.NET Core Web API` 项目,以实现基于许可证的授权机制。具体步骤包括创建项目、添加必要的 NuGet 包(如 `Standard.Licensing` 和 `Swashbuckle.AspNetCore`),以及修改 `Program.cs` 文件以集成自定义的许可证验证中间件。项目结构中新增了 `LicenseController` 接口用于处理授权相关操作,并通过测试流程验证了默认天气接口在未授权和授权状态下的响应情况。整个过程确保了应用程序能够在启动时正确验证许可证,保障系统的安全性与可控性。
50 8
.net8 使用 license 证书授权案例解析
|
3月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
310 76
|
3月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
4月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
130 52
|
3月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
4月前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
1天前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
41 29
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
145 2
|
10天前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8天前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。

热门文章

最新文章

推荐镜像

更多