JDK1.8 Steam流使用
全部中间操作
方法 | 说明 |
---|---|
sequential | 返回一个相等的串行的Stream对象,若是原Stream对象已是串行就可能会返回原对象 |
parallel | 返回一个相等的并行的Stream对象,若是原Stream对象已是并行的就会返回原对象 |
unordered | 返回一个不关心顺序的Stream对象,若是原对象已是这类型的对象就会返回原对象 |
onClose | 返回一个相等的Steam对象,同时新的Stream对象在执行Close方法时会调用传入的Runnable对象 |
close | 关闭Stream对象 |
filter | 元素过滤:对Stream对象按指定的Predicate进行过滤,返回的Stream对象中仅包含未被过滤的元素 |
map | 元素一对一转换:使用传入的Function对象对Stream中的全部元素进行处理,返回的Stream对象中的元素为原元素处理后的结果 |
mapToInt | 元素一对一转换:将原Stream中的使用传入的IntFunction加工后返回一个IntStream对象 |
flatMap | 元素一对多转换:对原Stream中的全部元素进行操做,每一个元素会有一个或者多个结果,而后将返回的全部元素组合成一个统一的Stream并返回; |
distinct | 去重:返回一个去重后的Stream对象 |
sorted | 排序:返回排序后的Stream对象 |
peek | 使用传入的Consumer对象对全部元素进行消费后,返回一个新的包含全部原来元素的Stream对象 |
limit | 获取有限个元素组成新的Stream对象返回 |
skip | 抛弃前指定个元素后使用剩下的元素组成新的Stream返回 |
takeWhile | 若是Stream是有序的(Ordered),那么返回最长命中序列(符合传入的Predicate的最长命中序列)组成的Stream;若是是无序的,那么返回的是全部符合传入的Predicate的元素序列组成的Stream。 |
dropWhile | 与takeWhile相反,若是是有序的,返回除最长命中序列外的全部元素组成的Stream;若是是无序的,返回全部未命中的元素组成的Stream。 |
全部终端操作
方法 | 说明 |
---|---|
iterator | 返回Stream中全部对象的迭代器; |
spliterator | 返回对全部对象进行的spliterator对象 |
forEach | 对全部元素进行迭代处理,无返回值 |
forEachOrdered | 按Stream的Encounter所决定的序列进行迭代处理,无返回值 |
toArray | 返回全部元素的数组 |
reduce | 使用一个初始化的值,与Stream中的元素一一作传入的二合运算后返回最终的值。每与一个元素作运算后的结果,再与下一个元素作运算。它不保证会按序列执行整个过程。 |
collect | 根据传入参数作相关汇聚计算 |
min | 返回全部元素中最小值的Optional对象;若是Stream中无任何元素,那么返回的Optional对象为Empty |
max | 与Min相反 |
count | 全部元素个数 |
anyMatch | 只要其中有一个元素知足传入的Predicate时返回True,不然返回False |
allMatch | 全部元素均知足传入的Predicate时返回True,不然False |
noneMatch | 全部元素均不知足传入的Predicate时返回True,不然False |
findFirst | 返回第一个元素的Optioanl对象;若是无元素返回的是空的Optional; 若是Stream是无序的,那么任何元素均可能被返回。 |
findAny | 返回任意一个元素的Optional对象,若是无元素返回的是空的Optioanl。 |
isParallel | 判断是否当前Stream对象是并行的 |
分组
// 按照sn分组: List<Map<String, Object>> dataList
Map<String, List<Map<String, Object>>> dataMap = dataList.stream().collect(Collectors.groupingBy(e -> e.get("sn") + ""));
//按照职员部分分组: List<Employee> list
Map<String, List<Employee>> collect = list.stream().collect(Collectors.groupingBy(i -> i.getUnitName()));
//多条件分组
Map<String, Map<String,List<Employee>>> collect =list.stream().collect(Collectors.groupingBy(i -> i.getUnitName(),Collectors.groupingBy(i -> i.getWorkType())));
过滤
//根据指定sn,过滤出符合的数据: List<Map<String, Object>> deviceDataList
List<Map<String, Object>> tempDeviceDataList = deviceDataList.stream().filter(map -> map.get("sn").toString().equals(sn)).collect(Collectors.toList());
//筛选出工资大于10000的职员
List<Employee> newList = list.stream().filter(item -> {
return item.getSalary().compareTo(new BigDecimal(10000)) > 0 && !item.getWorkType().equals("项目经理");
}).collect(Collectors.toList());
list转map
// (k1,k2)->k2 避免键重复 k1-取第一个数据;k2-取最后一条数据
//key和value,都可以根据传入的值返回不同的Map
Map<String, String> deviceMap = hecmEnergyDevicesList.stream()
.collect(Collectors.toMap(i -> i.getDeviceNum(), j -> j.getDeviceName(), (k1, k2) -> k1));
//
Map<String, Object> map = list.stream()
.collect(Collectors.toMap(i -> i.getEmpName() + i.getUnitName(), j -> j, (k1, k2) -> k1));
map转list
//在.map里面构造数据 return什么数据就转成什么类型的list
List<Employee> collect = map.entrySet().stream().map(item -> {
Employee employee = new Employee();
employee.setId(item.getKey());
employee.setEmpName(item.getValue());
return employee;
}).collect(Collectors.toList());
求和/极值
//List<Employee> list
//Bigdecimal求和/极值:
BigDecimal sum = list.stream().map(Employee::getSalary).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal max = list.stream().map(Employee::getSalary).reduce(BigDecimal.ZERO,BigDecimal::max);
//基本数据类型求和/极值:
Integer sum = list.stream().mapToInt(Employee::getId).sum();
OptionalInt optionalMax = list.stream().mapToInt(Employee::getId).max();
optionalMax.getAsInt();
求最大/最小值的对象
Optional<Employee> optional = list.stream().collect(Collectors.maxBy(Comparator.comparing(Employee::getId)));
if (optional.isPresent()) { // 判断是否有值
Employee user = optional.get();
}
return optional.orElse(new Employee());
去重
//去重之后进行拼接: List<String> deviceNodeList
Srting deviceNodeStr = deviceNodeList.stream().distinct().collect(Collectors.joining("','"));
//直接去重返回list
// List<String> deviceIdList
List<String> deviceIdList = deviceIdList.stream().distinct().collect(Collectors.toList());
排序
//按照时间排序 1升 -1降
Collections.sort(listFast, (p1, p2) -> {
return String.valueOf(p1.get("time")).compareTo(p2.get("time") + "");
});
// s1-s2 升序 s2-s1降序
Collections.sort(list,(s1,s2) -> s1.getSalary().compareTo(s2.getSalary()));
//多条件排序: List<Employee> list, s1-s2 升序 s2-s1降序
list.sort(Comparator.comparing(Employee::getSalary).reversed().thenComparing(Employee::getId).reversed());
拼接
//将某个字段,按照某个字符串拼接: List<Map<String, Object>> deviceMapList
String sns = deviceMapList.stream()
.map((m)->m.get("sn")+"").collect(Collectors.joining(","));
//使用场景很多,在sql里面用于组织in的值.比如:
SELECT sn,time,value FROM electric_real_time WHERE FIND_IN_SET(sn,?)
List<Map<String, Object>> dataList = JdbcUtil.getJdbcTemplate().queryForList(dataSql, sns)
统计
//统计:和、数量、最大值、最小值、平均值: List<Employee> list
IntSummaryStatistics collect = list.stream().collect(Collectors.summarizingInt(Employee::getId));
System.out.println("和:" + collect.getSum());
System.out.println("数量:" + collect.getCount());
System.out.println("最大值:" + collect.getMax());
System.out.println("最小值:" + collect.getMin());
System.out.println("平均值:" + collect.getAverage());
平均值
OptionalDouble average = list.stream().mapToInt(Employee::getId).average();
average.getAsDouble();
某个值的数量
//List<Employee> list
Map<BigDecimal, Long> collect = list.stream().collect(Collectors.groupingBy(i -> i.getSalary(),Collectors.counting()));
//List<Map<String,Object>> egyList
long count = egyList.stream()
.filter((Map m)->StringUtils.isNotEmpty(m.get(cols)+""))
.map((Map m)->new BigDecimal(m.get(cols)+""))
.count();
分区
//List<Employee> list
//单层分区
Map<Boolean, List<Employee>> collect = list.stream().collect(Collectors.partitioningBy(i -> i.getId() == 1));
//多层分区
Map<Boolean, Map<Boolean,List<Employee>>> collect = list.stream().collect(Collectors.partitioningBy(i -> i.getId() == 1,Collectors.partitioningBy(i -> i.getSalary().compareTo(new BigDecimal(20000)) == 0)));