使用lambda表达式Collectors.toMap 遇到的报错,带有源码分析

news2024/11/28 0:49:43
概述

正常hashMap中的key和value都允许为null,但是在list转map中,使用lambda表达式要求key和value都不能为null。这很反常识

起因

本身上游返回contentId和traceId 内容id和跟踪id,但是项目人员变动修改了接口没有给traceId导致

代码
public class test1 {
    public static void main(String[] args) {
        Hello hello1 = new Hello();
        hello1.setId(1);
        hello1.setValue("1");
        Hello hello2 = new Hello();
        hello2.setId(2);
        hello2.setValue(null);
        ArrayList<Hello> list = new ArrayList<>();
        list.add(hello1);
        list.add(hello2);
        Map<Integer, String> map = list.stream()
                .collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));
    }

    static class Hello {

        int id;
        String value;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

在merger的时候进行了判空
在这里插入图片描述

解决方案1 map给空设默认值或者是过滤掉

Map<Integer, String> map = list.stream().map(vo -> {
            if (vo.getValue() == null) {
                vo.setValue("default");
            }
            return vo;
        }).collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));

   Map<Integer, String> map = list.stream().filter(vo -> vo.getValue() == null)
                .collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));

    HashMap<Integer, String> m5 = list.stream().collect(
                Collectors.toMap(vo -> vo.getId(), vo -> Optional.ofNullable(vo.getValue()).orElse("default"), (a, b) -> b, HashMap::new));

解决方案2 自己collect 定义supplier,accumulator,combiner
        HashMap<Integer, String> m3 = list.stream()
                .collect(HashMap::new
                        , (map, item) -> map.put(item.getId(), item.getValue())
                        , HashMap::putAll);
        // 上面是简写版本,下面是揉开来的版本
        HashMap<Integer, String> m4 = list.stream()
                .collect(
                        () -> {
                            return new HashMap<Integer, String>();   // 这里定义了一个对象,相当于下面map,map1,map2的数据类型
                        }
                        , (map, item) -> map.put(item.getId(), item.getValue())
                        , (map1, map2) -> {
                            map1.putAll(map2);
                        });

在这里插入图片描述
这里有supplier,accumulator,combiner

      Map<Integer, String> map5 = list.stream().filter(vo -> vo.getValue() == null)
                .collect(Collectors.toMap(vo -> vo.getId(), vo -> vo.getValue(), (v1, v2) -> v1));
这里的写法点进Collectors.toMap

在这里插入图片描述
进入toMap
在这里插入图片描述

Supplier mapFactory 相当于HashMap::new
accumulator 相当于 (map, item) -> map.put(item.getId(), item.getValue()) 也相当于 (map, item) -> map.put(item.getId(), item.getValue())
mapMerger(mergeFunction) 相当于 map1.putAll(map2); 也相当于HashMap::putAll

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

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

相关文章

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…

最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)

&#x1f525;博客主页&#xff1a;只恨天高 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容…

【配电网故障定位】基于二进制混合灰狼粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#79】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制混合灰狼粒子群算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络…

安装GPT 学术优化 (GPT Academic)@FreeBSD

GPT 学术优化 (GPT Academic)是一个非常棒的项目 可以帮助我们完成中科院的一些日常工作。 官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读/润色/写作体验&#xff0c;模块化设计&#xff0c;…

JavaScript(JS)三种使用方式,三种输出方式,及快速注释。---[用于后续web渗透内容]

JavaScript&#xff08;JS&#xff09;是一种广泛使用的编程语言&#xff0c;允许在网页中添加交互性和动态效果。在HTML中&#xff0c;<script>标签用于引入和执行JavaScript代码。 JS代码 js1.html \\js三种使用方式<!DOCTYPE html> <html lang"en&quo…

Tomcat命令行窗口、IDEA中Tomcat控制台 中文乱码问题解决方案

Tomcat出现中文乱码问题 打开Tomcat文件夹下的conf/logging.properties文件&#xff0c;将下图位置中的编码由UTF-8全部替换成GBK 然后重启Tomcat服务器&#xff0c;问题解决 Intellij IDEA启动Tomcat服务器控制台出现中文乱码 解决方案非常简单&#xff0c;按照下图设置控制…

将数字状态码在后台转换为中文状态

这是我们的实体类 可以看出我们的状态status是2如过返回到前端我们根本不知道2代表的是什么&#xff0c;所以我们需要再这里将数字转换成能看懂的中文状态&#xff0c;首先我们创建一个枚举类 先将我们状态码所对应的中文状态枚举出来&#xff0c;然后创建一个静态方法&#…

设计模式学习(六)——《大话设计模式》

设计模式学习&#xff08;六&#xff09;——《大话设计模式》 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff0c;也称为静态工厂方法模式&#xff0c;它属于类创建型模式。 在简单工厂模式中&#xff0c;可以根据参数的不同返回不同类的实例。简单工厂…

超平实版Pytorch CNN Conv2d

torch.nn.Conv2d 基本参数 in_channels (int) 输入的通道数量。比如一个2D的图片&#xff0c;由R、G、B三个通道的2D数据叠加。 out_channels (int) 输出的通道数量。 kernel_size (int or tuple) kernel&#xff08;也就是卷积核&#xff0c;也可…

基于Springboot的社区防疫物资申报系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区防疫物资申报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Netty-NioServerSocketChannel与NioSocketChannel

NioServerSocketChannel NioServerSocketChannel是netty服务端的channel。在ServerbootStrap的bind方法中&#xff0c;通过反射&#xff0c;实例化对象NioServerSocketChannel。   NioServerSocketChannel对象实例化的过程中。 AbstractChannel中实例化channel的id&#xff…

TexStudio + MikTex 手动安装宏包

遇到上面这个 “宏包安装” 提示窗口后&#xff0c;设置来源为本地&#xff0c;随后在这个网址 https://mirrors.ustc.edu.cn/CTAN/systems/win32/miktex/tm/packages/ 下载所需的宏包&#xff0c;放到本地仓库里&#xff0c;即可 有三个宏包是必须要有的&#xff0c;它们是索…

UTS iOS插件

1、UTS插件无法出现 再uniapp x中使用时&#xff0c;必须给这个插件高度和宽度&#xff0c;否则出不来&#xff01; <uts-hello-view buttonText"点击按钮内容" style"width:375px;height: 375px;background-color: aqua;"></uts-hello-view>…

美业连锁门店收银系统源码-如何查看收款门店对应的加盟商?

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 第一步&#xff1a; 登录pc管理后端 第二步&#xff1a; 进入企业组织管理-门店管理&a…

遥测终端赋能水库泄洪监测预警,筑牢度汛安全防线!

4月10日&#xff0c;水利部召开水库安全度汛视频会议。会议要求着力强化水库防洪“四预”措施&#xff0c;加快构建雨水情监测预报“三道防线”&#xff0c;完善预警信息发布机制&#xff0c;推进数字孪生水利工程建设&#xff0c;为科学调度指挥决策提供支持。强调坚决牢牢守住…

HTML5漫画风格个人介绍源码

源码介绍 HTML5漫画风格个人介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 HTML5漫画风格…

如何在ubuntu上使用clash

下载CLASH软件 修改配置文件 解压之后&#xff0c;将.env文件中的URL改为自己订阅的URL&#xff0c;然后再执行start.sh脚本 最后按照提示&#xff0c;将clash.sh添加到环境变量 如何修改端口 在start.sh中更改 祝大家在ubuntu上玩得开心

Linux设置真实IP

1.查看ens33网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #添加以下内容 BOOTPROTODHCP #协议类型 dhcp bootp none ONBOOTyes #启动时是否激活 yes | no#修改文件完成后&#xff0c;重启网络 service network restartping www.baidu.com #验证网络是否生效 ifco…

基于SpringBoot框架的智慧食堂

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能 系统首页 用户注册页面 菜品信息页面 …

Postman之全局变量与环境变量配置

实际开发中可能需要不停切换环境&#xff0c;接口中来回输入环境地址比较麻烦&#xff0c;故而通过定义变量来节约频繁更换测试地址所耗费的时间。Postman 允许定义自己的全局变量&#xff08;Globals&#xff09;与环境变量&#xff08;Environment&#xff09;&#xff0c;最…