前言

对于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进行过滤、排序操作相关推荐

  1. Java 8 stream 流获取 list 中最大值、最小值、总和值、平均值

    模拟普通对象输出: // list static List<Employee> empList = new ArrayList<Employee>();private stat ...

  2. 利用Java8新特性stream流给集合中的某个属性赋值

    今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...

  3. 使用Stream流的map()方法,将每个元素封装为一个Person对象。 *  将新流中的元素提取为List集合。

    一 编程题[Stream流]* 1.4 题目(有难度)* 1.定义一个Person类,包含一个属性:姓名(String)* 定义无参.全参构造方法* 定义get/set方法* 2.定义main()方法 ...

  4. java byte 查找_在 stream流 和 byte[] 中查找(搜索)指定字符串

    在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的&q ...

  5. Java基础 Stream流方法引用异常文件

    Stream流 引例 需求:按照下面要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 1. 把所有以"曹"开头的元素存储到新集合中 2. 把曹开头,长度为3的元素存储到新 ...

  6. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

  7. Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...

  8. JDK8新特性(八)之Stream流的map()、sorted()、distinct()、match()方法

    1.Stream流的map()方法 如果需要将流中的元素映射到另一个流中,可以使用map方法.方法声明: <R> Stream<R> map(Function<? sup ...

  9. JAVA的stream流操作详细解析

    java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...

最新文章

  1. 只需3分钟,就能轻松创建 一个SpreadJS的React项目
  2. java培训教程分享:Java中用户如何自定义异常?
  3. PostgreSQL_case when
  4. elastic ik分词搜索_php环境下使用elasticSearch+ik分词器进行全文搜索
  5. nginx_rtmp中解析sps和pps
  6. mysql密码安全级别_Mysql数据库的安全性问题释疑
  7. oracle9i的erp数据库无法正常关闭的解决方法。
  8. 监控、链路追踪、日志的区别
  9. deep learning 学习资料
  10. [培训-无线通信基础-6]:信道编码(分组码、卷积吗、Polar码、LDPC码、Turbo码)
  11. 4. PKI - 数字签名、CA、数字证书
  12. AD硬件电路学习笔记(一)常见的管脚名字以及FPGA、Lora等常见的物联网组网
  13. (简单实用小技巧)在浏览器如何打开php文件
  14. Matlab saveas 函数批量保存彩色eps图片到指定路径
  15. 图层蒙版和图层剪贴路径_四种PS蒙版的运用:快速蒙版、图层蒙版、矢量蒙版、剪切蒙版...
  16. 小明的爷爷108岁了,而我30岁才开始学编程
  17. poi生成word 纸张方向横竖切换
  18. ACL 2021 Question Answering
  19. jQuery制作手风琴
  20. 免费聚合文章dedeCMS采集脚本网页采集器

热门文章

  1. 软件生成问候图片_这些社交软件你玩过几个?
  2. 计算机在材料科学中的应用上机二,计算机在材料科学中的应用-上机实验二.doc...
  3. python dataframe切片_python pandas dataframe 行列选择,切片操作方法
  4. cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项
  5. Java ClassLoader findClass()方法与示例
  6. linkedhashset_Java LinkedHashSet contains()方法与示例
  7. 小心Lombok用法中的坑
  8. CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群
  9. 微信开发4——PHP实现PC扫码授权登陆获取用户信息
  10. Buttons——CSS按钮样式库