ds1:java-stream流

news2024/10/7 2:22:24

文章目录

  • 1.修改集合中的值map
  • 2.过滤集合中符合条件的值filter
  • 找集合中的最大/小的值,及操作后元素的个数max()/min()/count()
  • 归约:对集合中所有元素进行自定义计算获取最终值reduce()
  • collect
    • 分组(partitioningBy/groupingBy)
    • 修改集合中元素之间的连接符join
  • 提取/组合

本文的学习文链接: http://t.csdn.cn/tjweo

1.修改集合中的值map

传入一个函数,函数的形参即为集合中的每一个值,该函数会对集合中的每一个元素进行函数体中的操作,最后返回一个新的值,修改或代替集合中的元素
分为两种情况:直接修改原来集合中的数据,生成一个新的集合。

高级玩法:可以直接在map中传入Student::getAge或personList.stream().map(p -> p.getAge()) , 获取到集合中所有对象的所有age,然后链式对属性操作,返回值也由集合中的对象类型变为对象的对应的属性类型。

		//直接修改原来的数据 所有学生的年龄加2
        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        List<Student> studentAgeAdd1 = list1.stream().map(x -> {
            x.setAge(x.getAge() + 2);
            return x;
        }).collect(Collectors.toList());
        System.out.println("list1 = " + list1);
        System.out.println("studentAgeAdd1 = " + studentAgeAdd1);

		//生成新的集合 所有学生的年龄加2
        List<Student> list2 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        List<Student> studentAgeAdd2 = list2.stream().map(x -> {
            return new Student(x.getUsername(), x.getAge()+2);
        }).collect(Collectors.toList());
        System.out.println("list2 = " + list2);
        System.out.println("studentAgeAdd2 = " + studentAgeAdd2);
//结果
Student(username=null, age=null)
list1 = [Student(username=a, age=3), Student(username=b, age=4), Student(username=c, age=5)]
studentAgeAdd1 = [Student(username=a, age=3), Student(username=b, age=4), Student(username=c, age=5)]
list2 = [Student(username=a, age=1), Student(username=b, age=2), Student(username=c, age=3)]
studentAgeAdd2 = [Student(username=a, age=3), Student(username=b, age=4), Student(username=c, age=5)]

2.过滤集合中符合条件的值filter

传入一个函数,函数的形参即为集合中的每一个值,该函数会对集合中的每一个元素进行函数体中的操作,函数体为一个条件判断,最后返回一个boolean值,为true则保留该元素为,false则去掉。最后生成一个新的集合。不改变原来的集合。

		//保留年龄大于等于3的学生
        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        List<Student> studentAgeAdd1 = list1.stream().filter((x) -> {
            return x.getAge() >= 2;
        }).collect(Collectors.toList());
        System.out.println("list1 = " + list1);
        System.out.println("studentAgeAdd1 = " + studentAgeAdd1);

找集合中的最大/小的值,及操作后元素的个数max()/min()/count()

list.stream().max().get();
list.stream().min().get();
list.stream().filter().count();//操作后的个数

		//获取学生年龄最大的那个
        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        Student student = list1.stream().max(Comparator.comparing(Student::getAge)).get();
        Student student1 = list1.stream().max((a, b) -> {
            return a.getAge() - b.getAge();
        }).get();
        System.out.println(student);
        System.out.println(student1);

//输出
Student(username=c, age=3)
Student(username=c, age=3)
		
		//统计过滤后的数量
        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        long count = list1.stream().filter(x -> x.getAge() >= 2).count();
//输出
2

归约:对集合中所有元素进行自定义计算获取最终值reduce()

reduce 、

		//将所有对象中某元素的值相加
        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        Integer sumAge = list1.stream().map(Student::getAge).reduce(Integer::sum).get();
        System.out.println(sumAge);

		//获取集合中所有元素和
        List<Integer> intList = Arrays.asList(1, 2, 3);
        Integer integer = intList.stream().reduce((sum, item) -> {
            sum += item;
            return sum;
        }).get();
        System.out.println(integer);

collect

流不存储数据,那么在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里。
toList/toSet/toMap
例:list->map

        List<Student> list1 = Arrays.asList(new Student("a",1),new Student("b",2),new Student("c",3));
        Map<String, Student> collect = list1.stream().collect(Collectors.toMap(Student::getUsername, p -> p));
        for (Map.Entry<String, Student> studentEntry : collect.entrySet()) {
            System.out.println(studentEntry);
        }
//打印
a=Student(username=a, age=1)
b=Student(username=b, age=2)
c=Student(username=c, age=3)

Collectors提供了一系列用于数据统计的静态方法:
计数:count
平均值:averagingInt、averagingLong、averagingDouble
最值:maxBy、minBy
求和:summingInt、summingLong、summingDouble
统计以上所有:summarizingInt、summarizingLong、summarizingDouble(包括计数,平均值,最值,和)

在这里插入图片描述

分组(partitioningBy/groupingBy)

partitioningBy():条件分组
groupingBy():根据集合内相同的元素进行分组

public class StreamTest {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("Tom", 8900, "male", "New York"));
		personList.add(new Person("Jack", 7000, "male", "Washington"));
		personList.add(new Person("Lily", 7800, "female", "Washington"));
		personList.add(new Person("Anni", 8200, "female", "New York"));
		personList.add(new Person("Owen", 9500, "male", "New York"));
		personList.add(new Person("Alisa", 7900, "female", "New York"));

		// 将员工按薪资是否高于8000分组
        Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));
        // 将员工按性别分组
        Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));
        // 将员工先按性别分组,再按地区分组,嵌套分组
        Map<String, Map<String, List<Person>>> group2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));
        System.out.println("员工按薪资是否大于8000分组情况:" + part);
        System.out.println("员工按性别分组情况:" + group);
        System.out.println("员工按性别、地区:" + group2);
	}
}


//输出结果
员工按薪资是否大于8000分组情况:{false=[mutest.Person@2d98a335, mutest.Person@16b98e56, mutest.Person@7ef20235], true=[mutest.Person@27d6c5e0, mutest.Person@4f3f5b24, mutest.Person@15aeb7ab]}
员工按性别分组情况:{female=[mutest.Person@16b98e56, mutest.Person@4f3f5b24, mutest.Person@7ef20235], male=[mutest.Person@27d6c5e0, mutest.Person@2d98a335, mutest.Person@15aeb7ab]}
员工按性别、地区:{female={New York=[mutest.Person@4f3f5b24, mutest.Person@7ef20235], Washington=[mutest.Person@16b98e56]}, male={New York=[mutest.Person@27d6c5e0, mutest.Person@15aeb7ab], Washington=[mutest.Person@2d98a335]}}

修改集合中元素之间的连接符join

public class StreamTest {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("Tom", 8900, 23, "male", "New York"));
		personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
		personList.add(new Person("Lily", 7800, 21, "female", "Washington"));

		String names = personList.stream().map(p -> p.getName()).collect(Collectors.joining(","));
		System.out.println("所有员工的姓名:" + names);
		List<String> list = Arrays.asList("A", "B", "C");
		String string = list.stream().collect(Collectors.joining("-"));
		System.out.println("拼接后的字符串:" + string);
	}
}

提取/组合

public class StreamTest {
	public static void main(String[] args) {
		String[] arr1 = { "a", "b", "c", "d" };
		String[] arr2 = { "d", "e", "f", "g" };

		Stream<String> stream1 = Stream.of(arr1);
		Stream<String> stream2 = Stream.of(arr2);
		// concat:合并两个流 distinct:去重
		List<String> newList = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());
		// limit:限制从流中获得前n个数据
		List<Integer> collect = Stream.iterate(1, x -> x + 2).limit(10).collect(Collectors.toList());
		// skip:跳过前n个数据
		List<Integer> collect2 = Stream.iterate(1, x -> x + 2).skip(1).limit(5).collect(Collectors.toList());

		System.out.println("流合并:" + newList);
		System.out.println("limit:" + collect);
		System.out.println("skip:" + collect2);
	}
}

//输出
流合并:[a, b, c, d, e, f, g]
limit:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
skip:[3, 5, 7, 9, 11]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctr-k8s镜像管理命令,将k8s正在使用的镜像推送仓库

​ k8s镜像管理命令 查出k8s中pod在使用的镜像 kubectl get -o wide deploy -n yxyw-uat |awk ‘{print $7}’ 查出镜像地址&#xff0c;勾选正则开头配上镜像推送命令 gem-acr-p-a01-registry-vpc.cn-shenzhen.cr.aliyuncs.com/osale/gyx-admin:yxyw-pre-2023-06-05-11-18…

便携式多功能校准器TD1858参考标准

体积小巧&#xff1a;相较于同档次技术指标的多功能校准器&#xff0c;体积缩小至50%&#xff0c;重量轻便&#xff1a;整机质量不到10 kg&#xff0c;人员可轻松实现搬运&#xff0c;方案价值&#xff1a;非常方便携带至工作现场对数字多用表和其他电测仪表进行校准。 直流电压…

搭建cesium源码调试环境

1. cesium源码下载 直接从github上下载即可 https://github.com/CesiumGS/cesium.git 本文下载的是最新版本1.106 2. cesium源码目录简介 1) packages目录 源码目录&#xff0c;包含engine&#xff0c;widgets 2&#xff09;Apps目录 包含一些示例代码 3&#xff09;Spec…

Node中express路由基本使用

1.路由的基本使用 //引入express const expressrequire("express") //创建路由 const appexpress() //规定路由的请求方法 app.get(/,(req,res)>{res.end("hello express") }) //启动路由&#xff0c;并且端口为9000 app.listen(9000,()>{console.l…

ruoyi-vue版本(三十)事务介绍和使用

目录 1 事务管理2 常见坑点13 常见坑点24 Transactional注解的常用属性表&#xff1a; 1 事务管理 新建的Spring Boot项目中&#xff0c;一般都会引用spring-boot-starter或者spring-boot-starter-web&#xff0c;而这两个起步依赖中都已经包含了对于spring-boot-starter-jdbc…

和鲸社区数据分析每周挑战【第九十六期:汽车公司客户细分预测】

和鲸社区数据分析每周挑战【第九十六期&#xff1a;汽车公司客户细分预测】 文章目录 和鲸社区数据分析每周挑战【第九十六期&#xff1a;汽车公司客户细分预测】一、前言1、背景描述2、什么是用户分群&#xff1f;3、数据说明4、数据集预览 二、数据读取和数据初步观察三、潜在…

【动态规划算法】第六题:63.不同路径II

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作…

2、DuiLib的入门程序以及资源压缩打包

标题 1、DuiLib入门程序11.1、DuiLib程序版本11.2、DuiLib程序版本21.3、DuiLib程序版本3&#xff0c;增加编写界面xml1.4、DuiLib程序版本4&#xff0c;继续修改xml布局1.5、DuiLib程序版本5&#xff0c;继续修改xml布局5.6、DuiLib程序版本5&#xff0c;继续修改xml布局 2、D…

Stable Diffusion 使用 SadTalker 生成图片数字人

Heygen和D-ID等照片转视频的工具&#xff0c;都需要在线付费使用。本次介绍一个SadTalker数字人。SadTalker有多种使用方式&#xff0c;包括完整安装程序和stable diffusion插件模式。安装程序操作较繁琐&#xff0c;因此推荐stable diffusion插件模式。 文章目录 SadTalker安…

【龙芯2K500先锋板】点亮RGB多彩发光板

文章目录 一、硬件准备1.1 DFRobot RGB多彩发光板1.2 龙芯2K0500开发板 二、背景知识三、实现点灯3.1 手动点亮3.2 手动熄灭3.3 实现PwmController3.4 实现呼吸灯效果 四、效果演示五、完整代码六、参考链接 前段时间乔帮主送了几个DFRobot的RGB多彩发光板&#xff0c;官方的演…

实现一个简单的录制软件:支持录制桌面与窗口

环境搭建 CSDN 将data文件与obs-plugins文件夹复制到bin/win32文件下 VS2019安装Qt插件&#xff08;附安装失败解决方案&#xff09;_振华OPPO的博客-CSDN博客 插件; 链接&#xff1a;https://pan.baidu.com/s/1fdNDJwrwrJ1SA0Q9AiM7qA?pwdiz4f 提取码&#xff1a;iz4f vs…

uniapp 微信小程序导航功能(从地址列表内点击某一个地址)

效果图&#xff1a; <template><view class"user"><view class"list"><view class"title">地址列表</view><view class"title-label"><view>名称</view><view>距离&#xff…

开启Windows共享文件夹审核,让用户查看谁删除了文件

在动画行业有个常用到的需求&#xff0c; 我的共享文件夹内的文件被谁删除了&#xff0c;查不到&#xff0c;只能查看谁创建&#xff0c;谁修改的&#xff0c;但查不到谁删除的&#xff0c;分享一下&#xff1a; 1 开始->运行->gpedit.msc 开发本地组策略编辑器, 在计算…

el-select 下拉选择框添加字段单位显示 el-select下拉按钮前加单位显示

背景&#xff1a;el-select可以通过自定义模版在下拉选项内加单位但是选择后没法显示单位 实现效果 实现代码 html <el-selectv-model"form.day"class"select-prefix"><el-option label"1" :value"1" /><el-option la…

Spark SQL 6-7

6. Spark SQL实战 6.1 数据说明 数据集是货品交易数据集。 每个订单可能包含多个货品&#xff0c;每个订单可以产生多次交易&#xff0c;不同的货品有不同的单价。 6.2 加载数据 tbStock&#xff1a; scala> case class tbStock(ordernumber:String,locationid:String,…

基于Java+vue前后端分离餐厅点菜管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Ext JS 如何设置工具栏按钮和一般按钮保持统一样式

在Ext JS 中, Button的背景色保持和系统的主色调一致, 样式如下: 但是使用工具栏(toolbar) 添加按钮的时候, 按钮的背景色确实灰色,如下图所示: 为什么会有这个差别呢? 如何让它们保持一致呢? 工具栏按钮与Button不一致的原因 看一下Toolbar里面的按钮最终产生…

C++中,C::C::C::C::foo() 为什么编译成功?

有人问&#xff1a; class Entity { public:static void foo() {} };int main() {Entity::Entity::Entity::Entity::Entity::foo(); } 为什么 最后那行&#xff1a; Entity::Entity::Entity::Entity::Entity::foo(); 能编译成功&#xff1f;这是什么规则&#xff1f; 嗯……

如何优雅的跳出 for 循环

文章目录 需求分析1. 普通for循环2. for..in循环3. for..of循环(ES6)4. forEach(callbackFn, ?thisArg)方法(ES5.1) 源码1. 终止 普通 for 循环2. 终止 forEach2.1 forEach 可以跳出本次循环&#xff0c;执行下一次循环2.2 forEach终止循环 需求 如何做到优雅的跳出 for 循环 …

像考研一样学个宇宙之刷题篇:剑指offerⅡ:整数系列——整数除法0706 TODO

001. 整数除法&#xff1a; 给定两个整数 a 和 b &#xff0c;求它们的除法的商 a/b &#xff0c;要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。 一些知识点和思路 第一题&#xff0c;easy题&#xff0c;狠狠来了个下马威。 首先是 “被除数/除数”关于溢出的情…