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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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 表达式常用的方法

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


最后


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

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

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

相关文章
|
14天前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
23天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
36 6
|
26天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
17 1
|
1月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
23 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
54 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
60 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
83 0
|
7天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。

推荐镜像

更多