工作中Java Stream的简单应用

news2025/4/8 9:22:03

标题

    • 开发使用
    • filter() and map()
    • max()根据集合对象中的某个属性取最大值

先解释一下各变量含义:

temps集合是userids的子集(大前提)
cache是temps集合在userids集合中的补集
简单来说就是,userids集合-temps集合=cache补集,如下图所示

目标:此次为工作中实际遇到的问题,需要得到cache集合,所以自己实现一下,本想使用正常语法,但是感觉太烦琐,得取多个变量名 (取变量名是最杀脑细胞的了), 总之就想试试Stream,其实在工作中真的很多CV,看看同事写的,复制,粘贴,改参数,改返回值,一条龙,完成。至于我为什么不复制粘贴,一把梭?我是那样的人吗? (主要是没有,日)
代码实现:根据外部传入的userids集合(是userid的源集合),temps是根据结果得到哪些是有用的userid(有一些不符合条件的过滤了,代码实现也是为了得到被过滤的userid),目标集合cache(是为了存入redis才取此名,把不合法的userid存入redis,)
这也是我在工作中第一次使用Stream,时隔多日,也顺便复习一下,总结一下

开发使用

//把对象集合转换为字符串集合(根据对象的某一属性)
//map函数的作用就是针对管道流中的每一个数据元素进行转换操作。
List<String> temps = responseBO.getItems()//返回体在下一个代码块,本应该是对象集合,使用了.map()转成String集合
	//把集合转成流,集合(经测试不含Map)和数组都有此方法,也可直接使用Stream.of("小明", "小林", "小李");创建一个流
    .stream()
    //得到所有对象中的userid属性
    .map(UseridItem::getUserid)
    //转成List<String>,泛型为字符串,是因为userid是字符串类型,也就是根据userid的类型生成的,
    //如为Long类型则生成List<Long>,小提示,这是根据某平台的api得到的json数据
    .collect(Collectors.toList());
//过滤出非法传入的userid(userids为外部传入的)
List<String> cache = userids.stream()
    //过滤:筛选符合条件的进行保留(并非是过滤掉符合条件的),不符合条件的去除
    .filter(o -> !temps.contains(o))
    //再把流转成List集合,也可使用Collectors.toMap()转成Map集合,不过这个需要传参,另说
    .collect(Collectors.toList());
//此为responseBO
 "errcode":0,
 "errmsg":"ok",
 "items":[
 	{//UseridItem
 		"userid":"xxxxx",
 		"new_userid":"AAAA"
 	},
 	{
 		"userid":"yyyyy",
 		"new_userid":"BBBB"
 	}
 ]

维恩图如下
在这里插入图片描述

filter() and map()

    List<UserInfo> userInfoList = new ArrayList<>();
    userInfoList.add(new UserInfo(1, "小明", 18));
    userInfoList.add(new UserInfo(2, "小林", 27));
    userInfoList.add(new UserInfo(2, "小李", 26));
    Map<Integer, UserInfo> collect = userInfoList.stream()
    		//得到此集合中年龄大于20的
            .filter(o -> o.getAge() > 20)
            //转成Map集合,不过这样会有问题,当key值重复时
            //Exception in thread "main" java.lang.IllegalStateException: Duplicate key UserInfo(id=2, name=小林, age=27)
            //方式一:key重复会报异常
            //.collect(Collectors.toMap(UserInfo::getId, Function.identity()));
            //.collect(Collectors.toMap(UserInfo::getId, v->v));
            //方式二:(k1,k2)->k1)重复则取之前的值,(k1,k2)->k2)新值覆盖旧真
            //.collect(Collectors.toMap(UserInfo::getId, v->v,(k1,k2)->k1));
    collect.forEach((k,v)-> System.out.println("k = " + k + ",v = " + v));
----------------------------------------------------------------
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo{
   private int id;
   private String name;
   private int age;
}

toMap()方法,key有冲突,保留旧值
在这里插入图片描述
toMap()方法,key有冲突,新值覆盖旧值
在这里插入图片描述

max()根据集合对象中的某个属性取最大值

userInfoList.stream()
            .max(Comparator.comparing(UserInfo::getAge))//返回值类型Optional<UserInfo> max,java8的新特性,优雅判空,不过我司并未使用
            //如果存在则输出,否则啥也不做,注意public void println(Object x)只能传入一个参数,
            // 所以Map不能使用System.out::println输出
            .ifPresent(System.out::println);

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

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

相关文章

C++编译链接

文章目录C编译链接C编译模式分离式编译是个啥&#xff1f;怎么实现上述过程&#xff1f;定义与声明引出新的问题头文件有关头文件用来干啥&#xff1f;include头文件中应该写什么&#xff1f;#ifndef通过gcc/g命令来看完整的编译链接过程预处理(Preprocessing)编译(Compilation…

院内导航系统哪家口碑好?医疗院内导航地图公司排名

“医生&#xff0c;请问验血怎么走&#xff1f;”   “护士&#xff0c;请问药房在哪儿&#xff1f;”   “您好&#xff0c;做CT在什么地方&#xff1f;”   这些问题是医生和护士经常遇到的问题。的确&#xff0c;患者就诊时&#xff0c;由于对医院环境不熟悉&#xff…

云计算(虚拟化)面试宝典

一:服务器虚拟化 1.名词解释 (1)资源动态调整(对象是虚拟机) 管理员操作,对CPU、内存、网卡、硬盘、GPU进行调整。 FusionCompute支持虚拟机资源动态调整,用户可以根据业务负载动态调整资源的使用情况。 虚拟机资源调整包括: 离线/在线调整vCPU数目 无论虚拟机处于离线…

如何使用C++图形界面开发框架Qt创建一个应用程序?(Part 3)

Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 点击获取Qt组件下载 …

Flink的状态编程

Flink 处理机制的核心&#xff0c;就是“有状态的流式计算”。在流处理中&#xff0c;数据是连续不断到来和处理的。每个任务进行计算处理时&#xff0c;可以基于当前数据直接转换得到输出结果&#xff1b;也可以依赖一些其他数据。这些由一个任务维护&#xff0c;并且用来计算…

【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验

STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F407----目录 前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 CAN通信波特率为 500K bps。 CAN通信引脚 与 MCU引脚 对应关系如下&#xff1a; CAN通信引脚MCU引脚TXPB9RXP…

虹科教您 | 虹科Automation softPLC入门操作指南(2)——子程序和用户自定义功能块 UDFB

虹科KPA Automation softPLC是为Linux、Xenomai、INtime、Windows等实时操作系统开发PLC的编程环境&#xff0c;适合需要使用IEC61131-3和PLCopen标准的控制技术和进行PLC编程的用户。本篇文章将帮助您创建和使用IEC语言开发的函数和功能块。 Automation softPLC Studio 命名规…

kettle 9.2源码打包和idea环境启动及常见错误

一&#xff1a;源码打包 这里为什么是kettle 9.2&#xff0c;因为kettle 9.3需要jdk11 这里直接去下载kettle的源码&#xff0c;tag9.2.0.4-R。这里需要自己搭建一个nexus仓库&#xff0c;因为有些包从kettle的仓库里面下载不下来。 nexus新建仓库代理, 记得加到public里面去 …

学术界or工业界,高校博后转行大厂工程师心得!

8本电子书免费送给大家&#xff0c;见文末。 导读&#xff1a;以下是这篇文章是一位 七月在线 学员的的学习和面试经历的分享&#xff0c;现将学员学习和面试心得分享给大家&#xff0c;祝大家都能有好的offer。 1 个人情况 我之前在高校做博后&#xff0c;现在转行到大厂做…

数据库的基本操作(7)

在这一篇博客中我将对数据库进行一个结尾&#xff0c;这将是关于数据库基本内容的结尾。 首先我们来简单总结一下前面的内容&#xff1a; 前面主要讲了Mysql中的索引和事务&#xff0c;这是面试必考的内容。 索引&#xff0c;怎么理解索引呢&#xff1f; 1.索引存在的意义&…

通用汽车在华加速推出智能电动车型

到2025年底前&#xff0c;推出超过15款基于奥特能平台打造的电动车型基于奥特能平台的雪佛兰FNR-XE纯电概念车全球首发通用汽车全新“软件定义汽车”平台将于明年正式推出近日&#xff0c;通用汽车中国在上海举办了“2022科技展望日”&#xff0c;展示了其在Ultium奥特能全球电…

IE高级配置中支持的SSL/TLS协议对应注册表值

一、手动勾选"Internet选项->高级->安全->使用TLS 1.2" 二、以编程方式勾选"Internet选项->高级->安全->使用TLS 1.2" 1.注册表值SecureProtocols对应的含义 注册表的路径为&#xff1a;HKEY_CURRENT_USER\Software\Microsoft\Windows…

【第六部分 | JavaScript高级】2:函数高级

目录 【第二章】函数进阶 | &#xff08;复习&#xff09;函数声明 | 函数也是对象 | 函数的this指向 | 改变函数this的指向 | 函数的“严格模式” | 闭包 | 浅拷贝和深拷贝 【第二章】函数进阶 | &#xff08;复习&#xff09;函数声明 | 函数也是对象 Java中的方法好…

Android基础二:常见的几种组件

关注我&#xff0c;会持续发布关于Android学习的内容&#xff01; 文章目录 前言 一、MaterialButton 二、MaterialButtonToggleGroup 三、TextView 文本组件 四、ImageView控件 总结 前言 本节我们来学习安卓&#xff08;Android&#xff09;的几种常用的组件&#xff0c;包括…

PTA题目 装睡

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏&#xff0c;你可以发现谁在装睡&#xff01;医生告诉我们&#xff0c;正常人睡眠时的呼吸频率是每分钟15-20次&#xff0c;脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏&#xff0c;请你找出他们…

VMware虚拟机安装ubuntu-16.04.5详细教程

不是每一位程序员都必须玩过linux&#xff0c;现在大多数服务器都是linux系统的&#xff0c;很多生产上的框架和工具都是安装在服务器上的&#xff0c;而且有不少大公司都要求熟悉在linux上开发&#xff0c;因此小编个人觉得大家有必要去了解一下linux&#xff08;现在大部分服…

vue.js毕业设计,基于vue.js前后端分离图书购物商城系统设计与实现(H5移动项目)

功能介绍 【后台管理员功能】 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 录入资讯&#xff1a;录入资讯标题、内容等信息 管理资讯&#xff1a;查看已录入资讯列表&#xff0c;支持删除和修改 广告设置&#xff1a;上传图片和设置小程序首页轮播图广告地…

RK3588-EDGE Ubuntu搭建HTTP服务器

一:开发环境 RK3588-EDGE版本根据指导文档开发环境需要Ubuntu18.04及以上。 本次选择在虚拟机中安装Ubuntu20.04进行开发。 二:安装Apache2 sudo apt-get install apache2 安装成功后配置文件位于“/etc/apache2 ” 其次在“/var/www/html”目录下会生成index.html文件…

mysql 多版本冲突安装(5..5和5.7)

1.我先装好了了5.5但是发现版本过低&#xff0c;需要重新装5.7&#xff08;所以只记录5.7的安装过程&#xff09; zip版的5.7&#xff0c;先解压 创建my.ini文件 [mysqld] port 3306 basedirC:\D\mysql-5.7.29-winx64datadirC:\D\mysql-5.7.29-winx64/data max_connections2…

视频编解码 — 帧内预测

目录 帧内预测 块大小 帧内预测模式 4x4 亮度块的帧内预测模式&#xff08;9种&#xff09; 16x16亮度块的帧内预测模式 8x8色度块的帧内预测模式 帧内预测模式的选择 率失真优化 帧内预测 一张图像中相邻像素的亮度和色度信息是比较接近的&#xff0c;并且亮度和色度…