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就行了~


本文也就到此结束,如果有更好的方法望告知~

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

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

相关文章

cls certificate.php,php加密解密处理类

PHP加密解密也是常有的事&#xff0c;发现discuz论坛里的PHP加密解密处理类代码&#xff0c;感觉挺不错&#xff0c;在用的时候&#xff0c;要参考Discuz论坛的passport相关函数&#xff0c;后面我会附上使用方法。php加密解密处理类<?php /* 文件名称&#xff1a;cls.sys_…

【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用

java操作redis时&#xff0c;StringRedisTemplate的expire()方法的作用&#xff0c;什么时候使用 //重新设置过期时间为30分钟&#xff0c;刷新时间 redisTemplate.expire(MsOpenApiRedisUtil.SESSION_KEY_IN_LOGIN_NAMEloginName,30,TimeUnit.MINUTES); redisTemplate.expire…

springboot使用redis(StringRedisTemplate的常用方法)

1. 先了解RedisTemplate和StringRedisTemplate之间的关系&#xff1a; RedisTemplate是Spring对于Redis的封装&#xff0c;而StringRedisTemplate继承RedisTemplate。两者的数据是不共通的&#xff1b;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据&…

html提交表单给php邮件发送,在HTML表单中通过PHP自动发送电子邮件

我最终解决了我的问题吧一个细节。我的HTML帖子回答:Navn: Kontakt e-post: Kontakt telefon: Fest:LokalfestHjemmefestKommune: Deltagere: Rydding: Vasking: Dorvakt: Noe annet?: 我的PHP帖子回答:if(isset($_POST[mailform]))$email $_POST[Epost] ;$name $_POST[Navn…

Arrays.asList()和Collections.singletonList()比较

Collections.singletonList(something)是不可变的&#xff0c; 对Collections.singletonList(something)返回的列表所做的任何更改将导致UnsupportedOperationException。 Arrays.asList(something)允许Arrays.asList(something) 更改 。 此外&#xff0c;由Collections.sin…

php 邮件类库,[3.3]-扩展类库:基于PHPMailer的邮件发送 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

3.3.1 扩展类库&#xff1a;基于PHPMailer的邮件发送此扩展可用于发送邮件。3.3.2 安装和配置从 PhalApi-Library 扩展库中下载获取 PHPMailer 包&#xff0c;如使用&#xff1a;$ git clone https://git.oschina.net/dogstar/PhalApi-Library.git然后把 PHPMailer 目录复制到 …

spring boot报FileSizeLimitExceededException异常的解决方法

开发spring boot程序时&#xff0c;遇到了如下错误&#xff1a; The field file exceeds its maximum permitted size of 1048576 bytes. 原因&#xff1a; Spring Boot工程嵌入的tomcat限制了请求的文件大小&#xff0c;官方文档中这样描述&#xff1a; Spring Boot embraces…

js表单提交 php,JavaScript提交表单的几种方法

在我们工作中我们会经常使用到form表单&#xff0c;相信大家再熟悉不过了&#xff0c;那么提交表单有很多种方法&#xff0c;JavaScript提交表单的方法又是如何呢&#xff0c;今天就带大家介绍下JavaScript提交表单的几种方法&#xff01;第一种方式&#xff1a;表单提交&#…

前后端分离中的权限管理思路

在传统的前后端不分的开发中&#xff0c;权限管理主要通过过滤器或者拦截器来进行&#xff08;权限管理框架本身也是通过过滤器来实现功能&#xff09;&#xff0c;如果用户不具备某一个角色或者某一个权限&#xff0c;则无法访问某一个页面。 但是在前后端分离中&#xff0c;…

陈顺志 php,芦芽山之情

芦芽山之情循着潺潺的水声&#xff0c;穿过颗颗红桦树&#xff0c;踩着红色的木板桥&#xff0c;听着山谷中传来的一声声清脆的鸟鸣&#xff0c;闻着扑鼻的在空气中酝酿着的雨露的清新&#xff0c;我们向芦芽山上走去。青山 白雾我们仿佛踏入了梦境的天地&#xff0c;山在雾中…

前、后端分离权限控制设计与实现

简述 近几年随着react、angular、vue等前端框架兴起&#xff0c;前后端分离的架构迅速流行。但同时权限控制也带来了问题。 网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景&#xff0c;满足不了我们用户、角色都是动态的场景。且仅仅前端…

风云php,t.php · 风云酷小子/js - Gitee.com

$ch curl_init();curl_setopt($ch, CURLOPT_URL, "http://zx.rcpx.cc/els/html/courseStudyItem/courseStudyItem.updateTimestepByUserTimmer.do");curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// post数据curl_setopt($ch,…

前后端分离必备的接口规范,十分接地气

1. 前言 随着互联网的高速发展&#xff0c;前端页面的展示、交互体验越来越灵活、炫丽&#xff0c;响应体验也要求越来越高&#xff0c;后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻&#xff0c;从而导致前后端研发各自专注于自己擅长的领域深耕细作。 然…

ubuntu php设置,关于ubuntu php环境设置详解-PHP问题

ubuntu php设置办法&#xff1a;起首更新源列表&#xff1b;而后关上“终端窗口”&#xff0c;输出饬令“sudo apt-get install php5”来装置php&#xff1b;接着装置设置装备摆设好apache环境&#xff0c;并装置php5-gd模块&#xff1b;最初创立“info.php”文件便可。Ubuntu …

springboot前后端分离后权限原理浅谈

1. 需求描述 最近在梳理springboot前后端分离后的权限管理问题。前段时间&#xff0c;已经把shiro的实现和spring security 的实现进行了初步的了解。如果深入细节&#xff0c;一个篇幅怕是不够。本文仅对权限管理的一些通用原理进行探讨。 2. 权限分类 在前后端分离之后&am…

js异步请求php数据,原生JS发送异步数据请求实例详解

这篇文章主要为大家详细介绍了原生JS发送异步数据请求的相关资料&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下在做项目的时候&#xff0c;有时候需要用到异步数据请求&#xff0c;但是如果这个时候没有框架的依赖&#xff0c;就需要用到原生JS进行…

MyBatis-Plus——增删查改

开发环境 IDEA JDK&#xff1a;1.8 Spring Boot:2.6.2 Maven:3.3.9 MySQL:8.0.23 数据库准备 CREATE DATABASE mybatis_plus_db;DROP TABLE IF EXISTS person; CREATE TABLE person(id BIGINT(20) NOT NULL COMMENT 主键ID, name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓…

让程序员最爽的ThreadLocal使用姿势

一、常见场景 ​ 1、ThreadLocal作为线程上下文副本&#xff0c;那么一种最常见的使用方式就是用来方法隐式传参&#xff0c;通过提供的set()和get()两个public方法来实现在不同的方法中的参数传递。对于编程规范来说&#xff0c;方法定义的时候是对参数个数是有限制的&#x…

php 堆和栈示例,php中堆和栈的使用

这篇文章介绍的内容是关于php中堆和栈的使用&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下一、关于堆和栈的概念及区别这里参考上篇博客&#xff1a; 浅谈堆和栈的区别通过这篇文章&#xff0c;我们可以知道广义的堆和栈到底…

一场事故告诉你zookeeper和nacos谁更适合做注册中心

前言 ​ 在分布式系统中&#xff0c;注册中心充当着重要角色&#xff0c;是服务发现、客户端负载均衡中不可缺少的一员。注册中心除了能够实现基本的功能外&#xff0c;他的稳定性、可用性和健壮性对整个分布式系统的流畅运行影响重大。dubbo作为国内一款主流的分布式系统&…