

常用的Lambda表达式案例解析,工作中都会用到
source link: https://mp.weixin.qq.com/s?__biz=MzUyOTg1OTkyMA%3D%3D&%3Bmid=2247484560&%3Bidx=1&%3Bsn=6790017fb3da8b644d521fa554a6ceb9
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我们日常工作中,Lambda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码
接下来我们把 Lambda 流的常用方法用案列讲解一下。
ForEach
集合的遍历forEach方法
public void testForEach(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.forEach(s-> System.out.println(s));
}
Collect
将操作后的对象转化为新的对象
public void testCollect(){
List<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
//通过 map 方法list中元素转化成 小写
List<String> strLowerList = list.stream()
.map(str -> str.toLowerCase())
.collect(Collectors.toList());
}
MapToInt
mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了,源码如下:
public void testMapToInt() {
List<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream()
.map(s -> Integer.valueOf(s))
.distinct()
.collect(Collectors.toList());
}
Sorted
Sorted 方法提供了排序的功能,并且允许我们自定义排序
public void testSorted(){
List<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> {
if("2".equals(s)) {
return "2";
}else {
return "1";
}
}));
}
FindFirst
findFirst 表示匹配到第一个满足条件的值就返回
public void testFindFirst(){
List<String> list = new ArrayList<String>() {{
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<String> str= list.stream()
.filter(s->"2".equals(s))
.findFirst();
// isPresent 为 true 的话,表示 value != null
if(str.isPresent()){
return;
}
}
Reduce
reduce 方法允许我们在循环里面叠加计算值
public void testReduce(){
List<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
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<String> list = new ArrayList<String>() {{
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 表达式常用的方法
懂这些,这样你在工作中遇到复杂数据结构转化时,肯定会得心应手了。
最后
欢迎关注公众号:月伴飞鱼
1.每天分享一篇实用的技术文章,对面试,工作都有帮助
2.后台回复666,获得我海量免费电子书籍,会持续更新,分享
觉得有收获,记得点赞,转发,分享,谢谢
Recommend
-
38
Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP , HTTPS 和邮件相关( SMTP , POP3 , IMAP )的协议链...
-
25
作者:Terrence Lu https://juejin.cn/post/6906398702269628424 这篇文章基于实际使用场景总结了24个ES6代码片段,可用来解决项目中遇到的一系列问题 1、如何隐藏所有指定元素?
-
5
运营工作中常用的一些数据处理方法(Excel篇)
-
6
1. 文字超出部分显示省略号单行文本的溢出显示省略号(一定要有宽度) p{ width:200rpx; overflow: hidden; text-overflow:ellipsis; white-space: nowrap; }多行文本溢出显示省略...
-
6
如果文章和笔记能带您一丝帮助或者启发,请不要吝啬你的赞和收藏,你的肯定是我前进的最大动力😁附笔记链接,阅读往期更多优质文章可移步查看,喜欢的可以给我点赞鼓励哦:
-
10
在线常用crontab表达式大全验证解析在线常用crontab表达式大全验证解析本工具能够通过特定的crontab表达式,计算出未来几次的执行时间,...
-
5
初衷: 整理一下工作中常用的JavaScript小技巧分享给大家,希望能帮助到各位小伙伴们,在工作中提升开发效率。适合人群: 前端初级开发,大佬绕道。1.函数参数默认值在Es6之前,我们要写参数默认值的...
-
6
〇、正则表达式的基本语法符号 若只简单匹配固定字符串,则无需任何修饰符,例如:需要匹配字符串 77,则可直接写:new Regex("77")。 下边例举一下常用的符号:(知道下面这些,一般的正则表达式便可...
-
9
Oracle提供了不少内置函数,熟练使用这些函数,可以大大提高我们工作效率。函数可以接受0个或多个入参,并返回一个输出结果。 2、Oracle函数分类 Oracle函数分为单行函数和聚合函数 单行函数:对每一个函数应...
-
5
工作中总结的30个常用Linux指令,实在记不住就别硬记了,看这篇就够了 作者:javabuild888 2024-03-26 10:36:08 list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK