Java8 Streams 让集合操作飞起来
2020-12-13 15:23
标签:tin 构建 默认方法 数据 == 有一个 ini 属性 去掉 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Stream 重点说明 ,并做了点补充。 Stream 分为中间操作和后期操作,中期操作会形成一个新的 Stream ,但不会马上对数据进行处理,到后期操作时,再遍历整个集合;可以没有中期操作直接后期操作。 forEach,collect,reduce,anyMatch,allMatch,noneMatch,findFirst 等; 其中属 collect 最为常用,还有一个专门用于 collect 的 Collectors 类,可以用于将集合转成 List,Set,Map 等 对一个 flatMap 很适合 创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。 Excel 通用导入导出,支持 Excel 公式 使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具 Java8 Streams 让集合操作飞起来 标签:tin 构建 默认方法 数据 == 有一个 ini 属性 去掉 原文地址:https://www.cnblogs.com/sanri1993/p/11580929.html前言
基本说明
创建流的方式
java.util.Collection
接口的默认方法 stream
或者 parallelStream
java.util.Arrays
的方法 stream
将数组变成流中期操作和后期操作
中期操作
后期操作
代码示例
数据准备
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Vehicle {
//车架号
private String vin;
// 车主手机号
private String phone;
// 车主姓名
private String name;
// 所属车租车公司
private Integer companyId;
// 个人评分
private Double score;
//安装的设备列表imei,使用逗号分隔
private String deviceNos;
}
static List
forEach 遍历Collection 数据
vehicles.forEach(vehicle -> System.out.println(vehicle));
//这样就可以遍历打印
vehicles.forEach(System.out::println);
forEach 遍历 Map 数据
Map
filter 数据过滤
// 去掉评分为 3 分以下的车
List
map 对象映射
List
大部分情况下,我们只需要列表中的某一列,或者需要把里面的每一个对象转换成其它的对象,这时候可以使用 map 映射,示例:// 取出所有的车架号列表
List
groupBy 按照某个属性进行分组
// 按照公司 Id 进行分组
Map
sort 按照某个属性排序 ,及多列排序
// 单列排序
vehicles.sort((v1,v2) -> v2.getScore().compareTo(v1.getScore()));
// 或使用 Comparator 类来构建比较器,流处理不会改变原列表,需要接收返回值才能得到预期结果
List
flatMap 扁平化数据处理
// 查出所有车绑定的所有设备
List
List
或 List
这种结构,可以当成一个列表来处理;像上面的设备列表,在数据库中存储的结构就是以逗号分隔的数据,而车辆列表又是一个列表数据。将 List 数据转成 Map
// 将 List 转成 Map ; key(vin) == > Vehicle
Map
mapReduce 数据处理
// 对所有司机的总分求和
Double reduce = vehicles.stream().parallel().map(Vehicle::getScore).reduce(0d, Double::sum);
求百分比
// 总的分值
Double totalScore = vehicles.stream().parallel().map(Vehicle::getScore).reduce(0d, Double::sum);
// 查看每一个司机占的分值比重
List
anyMatch/allMatch/noneMatch 匹配操作
// 检查是否有姓李的司机 true
boolean anyMatch = vehicles.stream().anyMatch(vehicle -> vehicle.getName().startsWith("李"));
// 检查是否所有司机的评分都大于 3 分 false
boolean allMatch = vehicles.stream().allMatch(vehicle -> vehicle.getScore() > 3);
// 检查是否有 3 公司的特务 true
boolean noneMatch = vehicles.stream().noneMatch(vehicle -> vehicle.getCompanyId() == 3);
一点小推广
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven