当前位置: 首页 > news >正文

Java8_关于list集合的操作Stream

一、前言

    list的遍历在日常编程中,应用非常普遍,在Java8中,对list集合的操作做了书写上的简化,使代码更简洁。

    在没有这些以前,我们写list的遍历是这样的

for(int i = 0;i<numList.size();i++){System.out.println(numList.get(i));
}

或者是这样的

for(Integer num : numList){System.out.println(num);
}

要做list的筛选,去重,求差,求并等操作就比较繁琐了,而Java8给我们带来新特性,是我们在做list集合操作时,非常简单。

二、举例子

有两个这样的集合

List<Integer> numList = new ArrayList();
numList.add(1);
numList.add(0);
numList.add(125);
numList.add(99);
numList.add(99);
numList.add(88);
//person有两个属性,一个是名称,一个是工作
List<Person> personList = new ArrayList<>();
personList.add(new Person("小红","程序员"));
personList.add(new Person("小明","程序员"));
personList.add(new Person("小雷","测试"));
personList.add(new Person("小泰","UI"));

2.1 list的遍历

遍历list元素

numList.forEach(num -> System.out.println(num));

2.2 list中每个元素做相同操作

将list中的每个元素乘2,变成新的集合

List<Integer> numListAfterCal = numList.stream().map(num->num*2).collect(Collectors.toList());

方法解析:

  • stream():把集合转成了流
  • map():接收一个函数作为参数, 把流里面的每个元素都执行一遍,并将其映射成一个新的元素。
  • collect(Collectors.toList()):将结果转换成list

2.3 list元素筛选

筛选出小于200的元素,变成新的集合或者输出

List<Integer> numListAfterCal = numList.stream().map(num -> num * 2).filter(num -> num < 200).collect(Collectors.toList());

方法解析: 

  • filter()  :筛选出满足条件的数据
numList.stream().map(num -> num * 2).filter(num -> num < 200).forEach(num -> {System.out.println(num);});

2.4 得到首个匹配到的结果

得到首个匹配到的结果

Optional<Integer> a = numList.stream().map(num -> num * 2).filter(num -> num < 200).findFirst();

2.6 去重、跳过元素、取元素数量

List<Integer> strListDistinct = numList.stream().distinct() //[1,0,125,99,88].skip(2) //[125,99,88].limit(2) //[125,99].collect(Collectors.toList());

方法解析: 

  • distinct():通过流中元素的 hashCode() 和 equals() 去除重复元素
  • limit(n):获取n个元素
  • skip(n):跳过n元素

2.5 list转成map

将personList按照工作类型分组

Map<String,List<Person>> map = personList.stream().collect(Collectors.groupingBy(Person::getJob));

得到结果如下:

{"程序员": [{"name": "小红","job": "程序员"},{"name": "小明","job": "程序员"}],"测试": [{"name": "小雷","job": "测试"}],"UI": [{"name": "小泰","job": "UI"}]
}

取出name和job组成一个map集合

 Map<String, String> personMap = personList.stream().collect(Collectors.toMap(p -> p.getName(), p -> p.getJob()));

得到结果如下:

{"小雷":"测试","小泰":"UI","小明":"程序员","小红":"程序员"}

 2.6 集合元素抽取出来,形成新集合

将personList中的人名抽取出来形成新的集合

List<String> list = personList.stream().map(Person::getName).collect(Collectors.toList());

如果需要对结果去重,加上.distinct()

List<String> list = personList.stream().map(Person::getName).distinct().collect(Collectors.toList());

得到结果如下:

["小红","小明","小雷","小泰"]

stream()优点

无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。

为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。

惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究
  • Condition使用
  • 安全测试中参数校验测试
  • 2024最全最新VMWare以及Linux配置(含yum失效解决方案)
  • 算法解析——双指针算法(3)数据匹配
  • 开启IDEA打开新项目时窗口提示
  • 【C#】 接口 继承
  • C++进阶-智能指针
  • 记录一次.gitignore 失效问题
  • Linux LD_PRELOAD优先加载so失效原因分析
  • 四向量优化算法(FVIM)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取
  • 前端项目部署
  • YOLOv8加载模型的3种方式说明:区别和适用场景是什么?
  • 1688 API 接口:电商系统的纽带
  • C++ STL初阶(9):list 中关于reverse_iterator的实现
  • 0x05 Python数据分析,Anaconda八斩刀
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JAVA 学习IO流
  • Java程序员幽默爆笑锦集
  • Java读取Properties文件的六种方法
  • Puppeteer:浏览器控制器
  • SpingCloudBus整合RabbitMQ
  • vue中实现单选
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 测试开发系类之接口自动化测试
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 浮现式设计
  • 关于 Cirru Editor 存储格式
  • 免费小说阅读小程序
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 人脸识别最新开发经验demo
  • 三分钟教你同步 Visual Studio Code 设置
  • 微服务框架lagom
  • 小程序button引导用户授权
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Hibernate主键生成策略及选择
  • # 达梦数据库知识点
  • ###C语言程序设计-----C语言学习(3)#
  • #1014 : Trie树
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #在 README.md 中生成项目目录结构
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)visual stdio 书签功能介绍
  • (轉)JSON.stringify 语法实例讲解
  • .aanva
  • .NET Micro Framework初体验
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET中的Exception处理(C#)
  • 。。。。。
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [2023-年度总结]凡是过往,皆为序章