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循环对于几万条数据来说效率较低:存储过程因为逻辑非常复杂,写起来 ...
随机推荐
- 前端(十二):react-redux实现逻辑
一.context实现数据传递 在react中,props和state都可以设置数据.不同的是,props借助组件属性传递数据但不可以渲染组件,它相对来说是“静态的”:state可以监听事件来修改数据 ...
- tcp程序设计--客户端获取服务器输入输出流
tcp程序设计--客户端获取服务器输入输出流 思路: 第一步:实例化一个ServerSocket对象(服务器套接字),用来等待网络上的请求(也就是等待来连接的套接字) 第二步:调用accept()方法 ...
- 基于.Net下整合RestSharp,实现REST服务客户端
一. 准备工作 1. 点击此访问 RestSharp 官网,可作参考 2. VS2012 中安装支持.Net4.0的最新版 RestSharp 插件 工具---NuGet程序包管理器---程序包管理器 ...
- DBUtils结果集处理器介绍
common-dbutils.jar是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能. 1.QueryRunner类 ① ...
- 创建Web项目运行时出小错误及解决方法
1.目录结构 2.各文件内容 index.jsp <%@ page contentType="text/html;charset=UTF-8" language=" ...
- 【Chromium】GPU进程启动流程
本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...
- CSS实现文字两端对齐
最近的项目遇到了这样的需求:(要求标题部分不管文字多少,都必须两端对齐) 如下图: 当时也没有多想直接使用‘ ’进行代替,毕竟产品同学想快一点看到效果,不敢怠慢!不过到第二个页面就傻眼了. 如图: 这 ...
- 利用Swig转换C++代码为C#可用的代码
详细的文件路径为:http://user.qzone.qq.com/1259374136/blog/1432887689 Swig学习教程 1.Swig的基本介绍 SWIG(Simplified Wr ...
- C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...
- 自学git心得-5
标签管理也是git里面比较重要的一部分内容,我们下载软件的时候经常看到诸如v2.0.v2.3.0这样的版本号,在git里也是一样,有时为了避免分支的名称五花八门而发生混淆的情况,我们常常会 给分支贴上 ...