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

简介: 前言文章首发在公众号(月伴飞鱼),之后同步到个人网站: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 表达式常用的方法

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


最后


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

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

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

相关文章
|
1天前
|
数据采集 数据可视化 数据挖掘
利用 DataFrame 进行数据分析:实战案例解析
【5月更文挑战第19天】DataFrame是数据分析利器,本文通过一个销售数据案例展示其使用:读取数据创建DataFrame,计算产品总销量,分析月销售趋势,找出最畅销产品,并进行数据可视化。此外,还提及数据清洗和异常处理。DataFrame为数据处理、分组计算和可视化提供便利,助力高效数据分析。
15 3
|
5天前
|
开发框架 搜索推荐 安全
【Uniapp 专栏】基于 Uniapp 的电商应用开发案例解析
【5月更文挑战第12天】使用Uniapp跨平台框架开发电商应用,结合丰富的组件和API,实现首页、商品详情、购物车及订单等关键功能。注重界面设计和用户体验,处理商品逻辑、订单管理和支付接口集成。同时,适应多平台特性,加入个性化推荐、商品直播和社交分享等特色功能,以降低成本、提升竞争力,打造高效购物体验。此案例展示了Uniapp在电商领域的潜力和优势。
|
5天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
44 2
|
5天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
162576 11
|
5天前
|
Java Spring 容器
【AOP入门案例深解析】
【AOP入门案例深解析】
19 2
|
5天前
|
缓存 NoSQL Java
Redis7的10大应用场景和案例解析
你在项目中使用 Redis 实现了什么应用场景,欢迎一起跟 V 哥讨论。同时也做个小调查,朋多少兄弟是需要了解 Redis 核心源码的,人多的话,下一篇 V 哥写 Redis7的源码分析,人少的话就算了,感谢。
|
5天前
|
并行计算 Java API
【专栏】Java 8的Lambda表达式增强了函数式编程,允许以匿名函数形式传递行为
【4月更文挑战第27天】Java 8的Lambda表达式增强了函数式编程,允许以匿名函数形式传递行为。其基本语法`(params) -> expression/statements`,类型由参数推断,可引用final或effectively final的外部变量。Lambda广泛应用于集合操作(如Stream API)、并行流处理和GUI事件处理,简化代码并提高效率。通过实例,展示了Lambda在集合筛选、并行计算和事件处理中的应用,从而提高开发质量和效率。
|
3天前
|
Linux 网络安全 Windows
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
|
4天前
HuggingFace Tranformers 源码解析(4)
HuggingFace Tranformers 源码解析
6 0
|
4天前
HuggingFace Tranformers 源码解析(3)
HuggingFace Tranformers 源码解析
7 0

推荐镜像

更多