Java8 Stream()关于在所有用户的所有上传记录中,找出每个用户最新上传记录
原创文章:转载请标明出处 https://www.cnblogs.com/yunqing/p/9504196.html
首先分析相当于如下,在所有的猫中,每个名字的猫都保留年龄最小的一个
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; public class test { public static void main(String[] args) {
List<Cat> list = new ArrayList<>();
list.add(new Cat("小花",1,1));
list.add(new Cat("小花",2,1));
list.add(new Cat("小2",3,1));
list.add(new Cat("小2",4,1));
list.add(new Cat("小3",5,1));
list.add(new Cat("小3",7,1));
list.add(new Cat("小花",3,1));
list.add(new Cat("小1",1,1));
list.add(new Cat("小1",2,1));
list.add(new Cat("小1",3,1));
list.add(new Cat("小3",3,1));
list.add(new Cat("小3",12,1)); List<Cat> result = new LinkedList<>(); Map<String, List<Cat>> res = list.stream().collect(Collectors.groupingBy(Cat::getName));
Set<String> keys = res.keySet(); for (String str : keys) {
List<Cat> groupList = list.stream().filter(e->e.getName().equals(str)).collect(Collectors.toList());
//以下两行都是找出组内年龄最小的猫
//Cat catMinAge0 = groupList.stream().reduce((one, two) -> one.getAge() < two.getAge() ? one : two).orElse(null);
Cat catMinAge1 = groupList.stream().min(Comparator.comparingInt(o -> o.getAge())).orElse(null);
result.add(catMinAge1);
} System.out.println(result); } } class Cat{
private String name;
private int age;
private int gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public Cat() {}
public Cat(String name, int age, int gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + ", gender=" + gender + "]";
} }
测试完毕,拿到项目中使用如下:
@Override
@Transactional
public List<DrivingRecord> findByCityCodeAndRecordTimeStartingWith(String cityCode, String recondTime) {
//查询此区域今天所有用户的所有上报记录
List<DrivingRecord> list = drivingRecondDao.findByCityCodeAndRecordTimeStartingWith(cityCode, recondTime);
List<DrivingRecord> resultList = new ArrayList<>();
//先根据用户分组,把同一个用户的上报记录放到同一个组
Map<User, List<DrivingRecord>> map = list.stream()
.collect(Collectors.groupingBy(DrivingRecord::getUser));
//取出所有用户key值
Set<User> keys = map.keySet();
//遍历所有用户
for (User user : keys) {
//找出与当前用户的分组
List<DrivingRecord> groupList = list.stream()
.filter(u->u.getUser().equals(user))
.collect(Collectors.toList());
//比较时间,取当前用户的最新上报的记录
DrivingRecord dr = groupList.stream()
.reduce((one,two)->one.getRecordTime().isBefore(two.getRecordTime())?two:one)
.orElse(null);
//把所有用户的最新上报信息填到resultList
resultList.add(dr);
} return resultList;
}
Java8 Stream()关于在所有用户的所有上传记录中,找出每个用户最新上传记录的更多相关文章
- 用户管理 之 在Linux系统中,批量添加用户的操作流程
一.阅读此文件您需要掌握的基础知识: <Linux 用户(user)和用户组(group)管理概述><用户(user)和用户组(group)配置文件详解><Linux 用 ...
- Oracle中找出用户的上次登录时间
可以使用如下sql语句: select t1.username,t1.logon_time last_logon_time,t2.account_status,created 账号创建时间 from ...
- 如何用Java8 Stream API找到心仪的女朋友
传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...
- java8 Stream的实现原理 (从零开始实现一个stream流)
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 ...
- 简洁又快速地处理集合——Java8 Stream(上)
Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的改变可以说是革命性的,影响足够深远,学习 Java 8 应该是 Java 开发者的必修课. 今天 ...
- Java8 Stream性能如何及评测工具推荐
作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java8的Stream就是兼具两者的知识.不学看不懂,学了写起代码来如虎添翼. 在上篇<Java8 Stre ...
- Java8 Stream 的最佳实践
Java8 Stream 的最佳实践 java8stream提供了对于集合类的流失处理,其具有以下特点: Lazy Evaluation(长度可以无限) 只能使用一次 内部迭代 Lazy Evalua ...
- Java8 Stream API
Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String co ...
- java8 Stream常用方法和特性浅析
有一个需求,每次需要将几万条数据从数据库中取出,并根据某些规则,逐条进行业务处理,原本准备批量进行for循环或者使用存储过程,但是for循环对于几万条数据来说效率较低:存储过程因为逻辑非常复杂,写起来 ...
随机推荐
- linux服务器上部署jdk+tomcat+rocketmq+redis-cluster
通常我们拿到一组干净的linux服务器,需要初始化安装一些基础软件,这里一站式介绍部署jdk+tomcat+rocketmq+redis-cluster 前言:如果要在多台服务器上安装,在一台服务器上 ...
- PAT 1074. Reversing Linked List
#include <cstdio> #include <cstdlib> #include <iostream> #include <unordered_ma ...
- 在 Ubuntu上使用 MySQL
MySQL 安装配置 https://help.ubuntu.com/12.04/serverguide/mysql.html MySQL Manual http://dev.mysql.com/do ...
- LOJ572: Misaka Network 与求和
传送门 假设 \(f^k(i)\) 就是 \(f(i)\) 莫比乌斯反演得到 \[ans=\sum_{i=1}^{N}\lfloor\frac{N}{i}\rfloor^2\sum_{d|i}f(d) ...
- Web服务器学习总结(一):web服务器简介
一.WEB服务器 1.1.WEB服务器简介 1.Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处 ...
- mac 下常用快捷键
1.快速搜索某个类 双击thift 2.切换不同的类: ctrl+方向键 3.alt+command+B 进入到具体的子类 但是 ctrl+方向键一直切的是电脑上 桌面的切换.打开 系统偏好设置-快捷 ...
- 类型安全的EventHandlerList
我们写一个类时,有时候会在同一个类上添加很多事件,事件很多的话,是不容易管理的,.NET提供的EventHandlerList可以辅助多个事件的管理,但不方便的地方是,它不是类型安全的,缺少类型安全, ...
- D3 JS study notes
如何使用d3来解析自定义格式的数据源? var psv = d3.dsvFormat("|"); // This parser can parse pipe-delimited t ...
- 排查 Azure 虚拟机的远程桌面连接问题
与基于 Windows 的 Azure 虚拟机 (VM) 的远程桌面协议 (RDP) 连接可能会因各种原因而失败,使用户无法访问 VM. 问题可能出在 VM 上的远程桌面服务.网络连接或主计算机上的远 ...
- 测试拆分比较大SQL Server数据库
有2个办法拆分比较大的数据库. 1.重建聚集索引2.收缩数据库 一.准备测试数据 )) go insert into blocktable(blockno,binno,rack,chipcount,m ...