目录
4.将对象集合的某一属性进行求和,元素属性名不固定,需要通过反射获取得到
1.将对象集合按照元素的某一属性进行分组,并求和某一属性,得到map
2. 将对象集合按照元素的某一属性进行分组,并统计个数,得到map
4.将对象集合按照某属性分组,再取分组后对象某一属性组成list
1.将对象的某两个属性(BigDecimal类型)做乘积操作,再求和
2.将对象的某两个属性(Double类型)做乘积操作,再求和
2. 将对象集合按照元素的某一属性进行筛选,再提取某一属性组成新的集合
一、修改集合元素
1.批量修改List<String>集合中的元素
例子:操作元素为字符串的集合,做截取->操作[“2021-09-01 12:00:33″,”2021-09-02 12:23:33”]集合,修改为[“2021-09-01″,”2021-09-02”]
List<String> holidayList = legalHolidays.stream().map(tmp -> {
String date = tmp.getDate();
int pos = date.indexOf(" ");
return date.substring(0, pos);
}).collect(Collectors.toList());
2.批量修改对象集合中元素的某一属性值
例子:批量修改List<User>中User对象的userName为userName.concat(“xx”)
方法一:
userList = userList.stream().map(item->{
String username = item.getUsername();
item.setUsername(username.concat("xx"));
return item;
}).collect(Collectors.toList());
方法二:peek()
userList = userList.stream().peek(item->
item.setName(item.getName().concat("xx")))
.collect(Collectors.toList());
注意在使用peek方法时必须要加上后面的.collect(Collectors.toList()),否则并不会修改元素。
二、提取集合元素值
1.提取集合中对象的某一属性,组成新集合
例子:提取List<Student>集合中Student对象的Num字段值
List<String> numList = studentList.stream().map(tmp ->
tmp.getNum()).collect(Collectors.toList());
2.提取集合中对象的某两个属性,组成map
Map<String,BigDecimal> elecPriceMap =
contractInfoList1.stream().collect(Collectors.toMap(Contract::getId,
Contract::getPrice));
3.提取map的value值,组成一个集合
elecMap.entrySet().stream().map(tmp ->
tmp.getValue()).collect(Collectors.toList());
三、对集合元素求和
1.对List<Double>求和
totalElec += yAxis1.stream().reduce(Double::sum).orElse(0.0);
2.对List<BigDecimal>求和
monthTotalElec = monthYAxis.stream().reduce(BigDecimal.ZERO,BigDecimal::add);
3.将对象集合根据某一属性求和
BigDecimal value=
contract2List.stream().map(Contract::getPrice)
.reduce(BigDecimal.ZERO,BigDecimal::add);
注意:getPrice()值不能为null,否则会报错。
4.将对象集合的某一属性进行求和,元素属性名不固定,需要通过反射获取得到
for(int i = 0; i<xAxis.size();i++)
{int j = i;
Double theHourlElec1 = hourlyDataList1.stream().map(hourlyData -> {
//反射,取集合中各元素的某属性
Double theElec = 0.0;
try {
Field field = hourlyData.getClass().getDeclaredField("h" + j);
field.setAccessible(true);
theElec = (Double) field.get(hourlyData);
} catch (NoSuchFieldException | IllegalAccessException e) {
log.error(e.getMessage());
}
return theElec;
}).collect(Collectors.toList()).stream().reduce(Double::sum).orElse(0.0);
//对属性值求和
}
四、对集合元素进行分组,再统计
1.将对象集合按照元素的某一属性进行分组,并求和某一属性,得到map
例子1:根据日期,分组统计电量(统计的属性为double类型);list集合为空时,会返回空map;
Map<String,Double> theMap =
hourlyDataList.stream().collect(Collectors.groupingBy(HourlyData::getDate,
Collectors.summingDouble(HourlyData::getTotalPower)));
例子2: 根据日期,分组统计电量;(统计的属性为BigDecimal类型)
Map<String, BigDecimal> theMap =
quarterDataList.stream().collect(Collectors.groupingBy(QuarterData::getDate,
Collectors.reducing(BigDecimal.ZERO,QuarterData::getTotalPower,BigDecimal::add)));
2. 将对象集合按照元素的某一属性进行分组,并统计个数,得到map
描述:根据日期进行分组并统计个数。 虽然map的key和value都可以为null,但是在用getDate来分组时,getDate不能为null,否则会报错。所以在分组之前先要对list做筛选。
Map<String, Long> netWorkLoadCntMap =
networkLoadList.stream().collect(Collectors.groupingBy(NetworkLoad::getDate,
Collectors.counting()));
3.将对象集合按照某一属性分组,得到一个分组后的map
Map<String, List<HourlyData>> map=
hourlyDataList1.stream().collect(Collectors.groupingBy(HourlyData::getContractId,
Collectors.toList()));
对分组后的map的key做进一步操作
hourlyDataList1.stream().collect(Collectors.groupingBy(HourlyData::getContractId))
.keySet().stream().map(item->item.concat("xxx").collect(Collectors.toList());
3.将对象集合按照某多个属性分组,得到一个分组后的map
Map<String, List<Student>> map =
voDataList.stream().collect(Collectors.groupingBy(item -> item.getName() + "-" +
item.getAge(), Collectors.toList()));
4.将对象集合按照某属性分组,再取分组后对象某一属性组成list
//根据学生姓名分组,取出分组后每组学生的年龄list
Map<String,List<Integer>> map=voDataList.stream
.collect(Collectors.groupingBy(item->item.getName(),
Collectors.mapping(Student::getAge,Collectors.toList())));
五、取对象集合的属性做运算
1.将对象的某两个属性(BigDecimal类型)做乘积操作,再求和
BigDecimal contractTotalPrice = contractInfoList.stream().reduce(
BigDecimal.ZERO, (x, y) ->
{
return x.add(y.getTotal().multiply(y.getPrice()));
}, BigDecimal::add);
2.将对象的某两个属性(Double类型)做乘积操作,再求和
orderList.stream().reduce(0.0, (x, y) -> x + (y.getNum() * y.getPrice()),
Double::sum);
六、集合元素去重
1.去重集合元素
List<String> list = Arrays.asList("xxx","vvv","xxx","yyy","zzz","vvv");
List<String> collect = list.stream().distinct().collect(Collectors.toList());
2.筛选出集合中重复的元素
Map<String, Long> collect=
strings.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
collect.forEach((k,v)->{ if(v>1) result.add(k);});
//if(v<=1)则筛选出没有重复的元素
七、条件筛选集合
1.将对象集合按照元素的某一属性进行筛选,得到新的集合
contractInfoList = contractInfoList.stream().filter(contract ->
contract.getName().equals("xx");
).collect(Collectors.toList());
2. 将对象集合按照元素的某一属性进行筛选,再提取某一属性组成新的集合
List<Double>list = netWorkList.stream().filter(tmp ->
theDate.equals(tmp.getDate()))
.map(NetworkLoad::getActualValue).collect(Collectors.toList());
八、集合元素排序
1.排序List<Object>
List<Object> list = Arrays.asList(3,1,4,11);
list = list.stream().sorted().collect(Collectors.toList());
注意:在调用.sorted()方法之后必须要带上.collect(Collectors.toList())并最终赋值给list,否则结果还是未排序的。
2.将集合逆序
Collections.reverse(dateList);
3.根据对象集合中元素的某一属性排序
List<StudentInfo> studentsSortName =
studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge))
.collect(Collectors.toList()
4.根据对象集合中的多个属性排序
gensetClDataList = gensetClDataList.stream()//根据date先倒序、time再升序排序
.sorted(Comparator.comparing(GensetClearingData::getDate).reversed())
.sorted(Comparator.comparing(GensetClearingData::getTime)).collect(Collectors.toList());
5.根据对象集合中元素的某一对象属性的属性排序
list.stream().sorted(Comparator.comparing(
o -> o.getPerson().getAge())).collect(Collectors.toList());
6.根据对象集合中元素的某一属性分组,并保证原来的排序
Map<String, List<EquityStructureVo>> groupByNameMap = list.stream().
collect(Collectors.groupingBy(EquityStructureVo::getName,
LinkedHashMap::new,Collectors.toList()));
九、最大、最小、均值
BigDecimal max = filterList.stream().reduce(BigDecimal::max).get();
BigDecimal min = filterList.stream().reduce(BigDecimal::min).get();
BigDecimal avg = filterList.stream().reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(filterList.size()), 6, BigDecimal.ROUND_HALF_UP);
十、注意
1.元素存在null值
List<BigDecimal> list=
Arrays.asList(BigDecimal.valueOf(1),null,BigDecimal.valueOf(2));
BigDecimal sum = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
reduce(BigDecimal.ZERO,BigDecimal::add)第一个参数是我们给出的初值,第二个参数是累加器。由于在list的元素中存在null值,所以上述代码会报错NullPointerException。在排序时也会存在此问题。因此,在用stream流进行操作时,最好先筛选掉null值。
2.调用方法无效
list.stream().map(item->{
Integer n = this.getNum();
return n;
});
在stream流里面写了需要调用getNum()方法,但实际上程序并不会去调用。
今天的文章5.JDK8中Stream流常用方法操作总结(详细)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33762.html