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循环对于几万条数据来说效率较低:存储过程因为逻辑非常复杂,写起来 ...
随机推荐
- 为什么要学习 UML?
UML 的首要价值是沟通和理解.好的图形可以帮助沟通设计思想,尤其是要回避许多细节时,图形也可以帮助你理解软件系统或业务流程.作为团队的成员,尝试弄清楚某些东西时,图形有助于理解和沟通整个团队所理解到 ...
- 02--CSS的继承性和层叠性
一 继承性 css有两大特性:继承性和层叠性 面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法.那么我们现在主要研究css,css就是在设置属性的.不会牵扯到方法的 ...
- localStorage跟cookie的使用
最近做了记住密码功能,用localStorage跟cookie都尝试用了一下,感觉都挺好哈,很方便,特此记录 html代码: <input type="text" id=&q ...
- is_array判断是否为数组
if(is_array($arr)){ echo "是数组"; }else{ echo "不是数组"; }
- laravel开发之-php artisan命令
php artisan :所有的命令列表 php artisan make:controller 文件夹名称/控制器名称 :创建控制器的命令以及控制器放置的文件夹 php artisan make:m ...
- .net C# Sql数据库SQLHelper类
using System;using System.Collections.Generic;using System.Text;using System.Collections;using Syste ...
- CentOS6.5(1)----设置静态IP并禁用IPV6
使用vim命令编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0 ...
- C++笔记(1)----此运算符函数的参数太多
在VS2015中定义了这样一个类: #include<iostream> #include<vector> #include<string> using names ...
- C# 五大修饰符
修饰符 访问权限 public 关键字是类型和类型成员的访问修饰符. 公共访问是允许的最高访问级别. 对访问公共成员没有限制 private 私有访问是允许的最低访问级别. 私有成员只有在声明它们的类 ...
- FDFDF
Linux(Centos)之安装Nginx及注意事项 1.Nginx的简单说明 a. Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,期初开发的目的 ...