Java利用stream(流)对map中的values进行过滤、排序操作
前言
对于Java8中的stream(流)这种优雅、方便、快捷、高效的操作已经是信手沾来了吧,但是却仅限List、Set。难道我Map不要面子得嘛?在工作中需要对从List转Map的数据进行操作,因此便有这随笔。
新建一个User
类,注意下面使用lombok
;如果你是idea
请下载相关插件以及依赖,我这里使用maven
引,在这里不多详细说明了。
Copy/*** @program: strategy-demo* @description: stream操作* @author: YuAoTian* @create: 2020-01-06 23:23**/
@Data
@AllArgsConstructor
class User{private Integer id;private String name;private String city;private Integer age;
}
继续看代码,看Main
方法里面的
Copy public static void main(String[] args) {List<User> userList = Arrays.asList(new User((int) (Math.random()*10),"小明","北京",18),new User((int) (Math.random()*10),"小红", "南京", 17),new User((int) (Math.random()*10),"小丫", "湖北", 14),new User((int) (Math.random()*10),"小黑", "深圳", 22),new User((int) (Math.random()*10),"小玉", "广州", 19),new User((int) (Math.random()*10),"小小", "江西", 21));Map<Integer, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getId));//已ID作为Key}
Map排序
正排
CopyMap<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> o.getValue().get(0).getAge())).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;}).get();System.out.print(map);
输出
Copy{5=[User(id=5, name=小丫, city=湖北, age=14), User(id=5, name=小玉, city=广州, age=19), User(id=5, name=小小, city=江西, age=21)], 0=[User(id=0, name=小红, city=南京, age=17)], 8=[User(id=8, name=小明, city=北京, age=18)], 9=[User(id=9, name=小黑, city=深圳, age=22)]}
倒排
Copy Map<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;}).get();System.out.print(map);
输出
Copy{3=[User(id=3, name=小黑, city=深圳, age=22)], 5=[User(id=5, name=小玉, city=广州, age=19)], 0=[User(id=0, name=小明, city=北京, age=18), User(id=0, name=小丫, city=湖北, age=14)], 2=[User(id=2, name=小红, city=南京, age=17), User(id=2, name=小小, city=江西, age=21)]}
以上是对年龄进行从小到大和从大到小的排序,并且最后返回的是一个Optional
,如果不懂的可以接下来看一些例子。
CopyOptional<Map<Integer, List<User>>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).map(entry -> {Map<Integer, List<User>> result = new LinkedHashMap<>();result.put(entry.getKey(), entry.getValue());return result;}).reduce((map1, map2) -> {map2.forEach(map1::put);return map1;});//为null返回false,否则true,即可调用get()返回~if(map.isPresent()){Map<Integer, List<User>> listMap = map.get();//调用get()返回一个Map}System.out.print(map);
优化
CopyMap<Integer, List<User>> map = userMap.entrySet().stream().sorted(Comparator.comparing(o -> {//倒排中 reversed() 方法 是object 对象,需要在里面强制回 Entry 就行。Map.Entry<Integer, List<User>> temp = (Map.Entry<Integer, List<User>>) o;return temp.getValue().get(0).getAge();}).reversed()).collect(LinkedHashMap::new,(m,e) -> m.put(e.getKey(),e.getValue()),LinkedHashMap::putAll);
是不是瞬间感觉世界清静了很多~你还可以处理一下一些缩进,能把他缩到一行!
Map过滤
Copymap.entrySet().stream().filter(entry -> entry.getValue().get(0).getAge() > 16)
.collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), LinkedHashMap::putAll);System.out.println(map);
输出
Copy{1=[User(id=1, name=小丫, city=湖北, age=14)]}
过滤掉年龄<
16的,过滤非常简单我就不提供其他例子了;一个filter然后直接collect就行了~
本文也就到此结束,如果有更好的方法望告知~
Java利用stream(流)对map中的values进行过滤、排序操作相关推荐
- Java 8 stream 流获取 list 中最大值、最小值、总和值、平均值
模拟普通对象输出: // list static List<Employee> empList = new ArrayList<Employee>();private stat ...
- 利用Java8新特性stream流给集合中的某个属性赋值
今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...
- 使用Stream流的map()方法,将每个元素封装为一个Person对象。 * 将新流中的元素提取为List集合。
一 编程题[Stream流]* 1.4 题目(有难度)* 1.定义一个Person类,包含一个属性:姓名(String)* 定义无参.全参构造方法* 定义get/set方法* 2.定义main()方法 ...
- java byte 查找_在 stream流 和 byte[] 中查找(搜索)指定字符串
在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的&q ...
- Java基础 Stream流方法引用异常文件
Stream流 引例 需求:按照下面要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 1. 把所有以"曹"开头的元素存储到新集合中 2. 把曹开头,长度为3的元素存储到新 ...
- Java 8 - Stream流骚操作解读2_归约操作
文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...
- Java 8 Stream 流用法及语法
Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...
- JDK8新特性(八)之Stream流的map()、sorted()、distinct()、match()方法
1.Stream流的map()方法 如果需要将流中的元素映射到另一个流中,可以使用map方法.方法声明: <R> Stream<R> map(Function<? sup ...
- JAVA的stream流操作详细解析
java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...
最新文章
- 只需3分钟,就能轻松创建 一个SpreadJS的React项目
- java培训教程分享:Java中用户如何自定义异常?
- PostgreSQL_case when
- elastic ik分词搜索_php环境下使用elasticSearch+ik分词器进行全文搜索
- nginx_rtmp中解析sps和pps
- mysql密码安全级别_Mysql数据库的安全性问题释疑
- oracle9i的erp数据库无法正常关闭的解决方法。
- 监控、链路追踪、日志的区别
- deep learning 学习资料
- [培训-无线通信基础-6]:信道编码(分组码、卷积吗、Polar码、LDPC码、Turbo码)
- 4. PKI - 数字签名、CA、数字证书
- AD硬件电路学习笔记(一)常见的管脚名字以及FPGA、Lora等常见的物联网组网
- (简单实用小技巧)在浏览器如何打开php文件
- Matlab saveas 函数批量保存彩色eps图片到指定路径
- 图层蒙版和图层剪贴路径_四种PS蒙版的运用:快速蒙版、图层蒙版、矢量蒙版、剪切蒙版...
- 小明的爷爷108岁了,而我30岁才开始学编程
- poi生成word 纸张方向横竖切换
- ACL 2021 Question Answering
- jQuery制作手风琴
- 免费聚合文章dedeCMS采集脚本网页采集器
热门文章
- 软件生成问候图片_这些社交软件你玩过几个?
- 计算机在材料科学中的应用上机二,计算机在材料科学中的应用-上机实验二.doc...
- python dataframe切片_python pandas dataframe 行列选择,切片操作方法
- cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项
- Java ClassLoader findClass()方法与示例
- linkedhashset_Java LinkedHashSet contains()方法与示例
- 小心Lombok用法中的坑
- CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群
- 微信开发4——PHP实现PC扫码授权登陆获取用户信息
- Buttons——CSS按钮样式库