Stream——替换集合中的某些值_java stream修改集合中元素-程序员宅基地

技术标签: java基础  java  

简单类型集合修改值

准备一个简单的数据集合,如:List<String>,如下所示:

List<String> stringList = Arrays.asList("2023-01-08", 
										"2023-02-08", 
										"2023-03-08",
										"2023-04-08",
										"2023-05-08");

需要实现的功能:

yyyy-MM-dd转换为yyyy/MM/dd的样式。

此时使用stream,则可以采取map()进行操作,如下所示:

List<String> stringList = Arrays.asList("2023-01-08", "2023-02-08", "2023-03-08", "2023-04-08","2023-05-08");
List<String> collect = stringList.stream().filter(x -> x != null && x != "").map(x -> {
    
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
    
        Date date = dateFormat.parse(x);
        DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        return format.format(date);
    } catch (ParseException e) {
    
        e.printStackTrace();
    }
    return x;
}).collect(Collectors.toList());

collect.stream().forEach(e-> System.out.println(e));

数据打印后,效果如下所示:

2023/01/08
2023/02/08
2023/03/08
2023/04/08
2023/05/08

当然,也可以采取peek()方式,如下所示:

List<String> stringList = Arrays.asList("2023-01-08",
                "2023-02-08",
                "2023-03-08",
                "2023-04-08",
                "2023-05-08");

List<String> collect = stringList.stream().filter(x -> x != null && x != "").peek(x -> {
    
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
    
        Date date = dateFormat.parse(x);
        DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        format.format(date);
    } catch (ParseException e) {
    
        e.printStackTrace();
    }
}).collect(Collectors.toList());

collect.stream().forEach(e-> System.out.println(e));

对象集合,修改对象中的某个属性

依旧准备一个对象集合,不过对象很简单,如下所示:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
    
    private String dates;
}
List<User> users = Arrays.asList(new User("2023-01-08")
                ,new User("2023-02-08")
                ,new User("2023-03-08")
                ,new User("2023-04-08")
                ,new User("2023-05-08"));

依旧是按照上面的格式进行转换,此时需要使用到peek,如下所示:

List<User> users = Arrays.asList(new User("2023-01-08")
        ,new User("2023-02-08")
        ,new User("2023-03-08")
        ,new User("2023-04-08")
        ,new User("2023-05-08"));
List<User> collect = users.stream().filter(x -> x.getDates() != null && x.getDates() != "").peek(x -> {
    
    String dates = x.getDates();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date parse = null;
    try {
    
        parse = dateFormat.parse(dates);
        DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        x.setDates(format.format(parse));
    } catch (ParseException e) {
    
        e.printStackTrace();
    }

}).collect(Collectors.toList());

collect.stream().forEach(e-> System.out.println(e));

执行后,打印效果如下所示:

User(dates=2023/01/08)
User(dates=2023/02/08)
User(dates=2023/03/08)
User(dates=2023/04/08)
User(dates=2023/05/08)

如果使用map()呢?可以如下面这种方式做:

List<User> users = Arrays.asList(new User("2023-01-08")
        ,new User("2023-02-08")
        ,new User("2023-03-08")
        ,new User("2023-04-08")
        ,new User("2023-05-08"));
List<User> collect = users.stream().filter(x -> x.getDates() != null && x.getDates() != "").map(x -> {
    
    String dates = x.getDates();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date parse = null;
    try {
    
        parse = dateFormat.parse(dates);
        DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        x.setDates(format.format(parse));
    } catch (ParseException e) {
    
        e.printStackTrace();
    }
    return x;
}).collect(Collectors.toList());

collect.stream().forEach(e-> System.out.println(e));

map 与 peek 的区别

从方法结构上看,map有一个返回类型,peek为void,只操作原stream中的各个元数据对象。

  • map

Stream map(Function<? super T, ? extends R> mapper);

  • peek

Stream peek(Consumer<? super T> action);

Stream的peek和map的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38322527/article/details/130566738

智能推荐

SQL性能的度量 - 通过v$sql_plan查询执行计划-程序员宅基地

文章浏览阅读605次。在分析SQL语句性能时,视图v$sql_plan很有用,以下分几点举例说明。 通过以下脚本可以查询库缓存中已经运行过的SQL的执行计划 col"Explain Plan" fo..._v$sql_plan

Python远程开关机_python wol-程序员宅基地

文章浏览阅读2.2k次。使用python实现远程开机、关机_python wol

CTFHub SSRF-程序员宅基地

文章浏览阅读649次,点赞3次,收藏4次。CTFHub SSRFSSRF简介漏洞攻击方式CTFHub SSRF靶场第一部分(Http、Dict和file等协议的利用)内网访问伪协议读取文件端口扫描SSRF简介SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统,也就是说可以利用一个网络请求的服务,当作跳板进行攻击_ctfhub ssrf

【ZYNQ入门】第十篇、基于FPGA的图像白平衡算法实现_基于fpga的白平衡-程序员宅基地

文章浏览阅读1.7k次,点赞29次,收藏44次。step1、分别对图像的R、G、B三通道的数据进行求和得到Rsum、Gsum、Bsum;step2、获取图像的R、G、B三通道的平均值Rv,Gv,Bv;imag_width:当前图像的宽,imag_high:当前图像的高度。step3、将求得的Rv、Gv、Bv 进行加和取平均值,得到step4、分别将R、G、B三通道的数据带入公式进行计算,得到新的值G通道:B通道:step5、最后将计算后的图片显示出来,便是白平衡后的图像。_基于fpga的白平衡

FPGA快速入门3——verilog可编程进阶_verilog中<=电路-程序员宅基地

文章浏览阅读685次。前两节主要介绍了Verilog一些基础的知识点,本节给大家介绍一些高级的进阶知识点。高级进阶知识点包括阻塞赋值和非阻塞赋值、assign和always语句差异、什么是锁存器、状态机、模块化设计等。阻塞赋值和非阻塞赋值在Verilog中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句(“<=”)。正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要。Veril..._verilog中<=电路

Android 通过JNI实现守护进程(上)_android 手机锁屏之后后台运行 jni实现-程序员宅基地

文章浏览阅读585次。来源:LeBron_Six 链接:blog.csdn.net/yyh352091626/article/details/50542554开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家… 虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了…网上_android 手机锁屏之后后台运行 jni实现

随便推点

java集合(超详细)-程序员宅基地

文章浏览阅读4.5w次,点赞178次,收藏1k次。所有的集合类和集合接口都在java.util包下。在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。_java集合

pandas DataFrame 用法--查看和选择数据_pandas中对dataframe的数据如何进行查询-程序员宅基地

文章浏览阅读5.4k次。1.使用 .head() 查看 DataFrame 头部数据2.使用 .tail() 查看 DataFrame 尾部数据3.使用 .describe() 查看 DataFrame 统计数据4.使用 .T查看 DataFrame 转置数据5. 使用 .sort_index() 查看按照轴排序的数据6. 使用 .sort_values() 查看按照值排序的数据7.at 函数:通过行名和列名来取值(取行名为a, 列名为A的值)8.iat 函数..._pandas中对dataframe的数据如何进行查询

CreateFont函数关于字符集与字体的两个参数_createfont字符集怎么设置-程序员宅基地

文章浏览阅读5.8k次。对于fdwCharSet和lpszFace两个参数以及他们的关系,刚开始不是很理解,所以google了一些资料,对这个问题有了一点自己的认识。_createfont字符集怎么设置

小米格机9008救砖后如何跳过nv损坏进入MIUI系统写基带并修临时基带_9008备份基带-程序员宅基地

文章浏览阅读2.7k次。我k40刷完后虽然串号这些都有了也识别卡了但是没信号是因为modem分区用的工厂包的文件还是我手机坏了或者qcn有问题如果你在没有改qcn的情况下刷回原系统的modem分区文件你又会进入nv损坏无限重启[doge]这时你就会发现电脑设备管理器会出现新的4个新设备端口打开QPST就可以刷基带了(k40在正常的系统我觉得应该也可以用这种方式开启端口备份基带,改串号可以用星海之类的软件正常勿改)。以上都是经验之谈具体看个人[坏笑][坏笑][坏笑][坏笑]从折腾了这几天的红米k40来看。从k40救砖经验来看。_9008备份基带

参与CSDN1024程序员节活动-程序员宅基地

文章浏览阅读4k次。有幸参与了CSDN主办的1024程序员活动-岳麓对话,聆听各位专家畅谈中国软硬件产业的根技术以及前沿科技的发展现状和未来。听程序员们聊技术,都比较实在落地,在谈到如果你有个孩子在读大学你会推荐他学什么专业和技术时,各位大佬都集体推荐本专业或本专业的基础学科,都充满了对自己行业的自豪感。小冰CEO李笛说:学习人工智能,未来如果技术被颠覆了,等于是自杀,而不学人工智能,则相当于是他杀。百度副总裁马杰说:我们应站在时代的肩膀上,人工智能在深刻地改变我们的世界,未来会持续产生影响。国科量子副总裁聂际敏说:学

BIM族库下载——10套知名地产Revit样板文件_地暖bim效果图-程序员宅基地

文章浏览阅读1.2k次。【资源介绍】资源名称:10套知名地产Revit样板文件资源分类: BIM族库、Revit族库其他简介:10套知名地产Revit样板文件【资源下载】链接:https://pan.baidu.com/s/1qsTHMbhGkiXztPQDmJlKfQ提取码:wb33【资源截图】【免责申明】本站提供的资源下载链接均来自互联网,仅供学习研究之用,不得用于商业,请在24小时内删除!资源版权归原作者及其公司所有,如果你喜欢,请购买正版。..._地暖bim效果图