目录
一、修改集合元素
1.批量修改List集合中的元素
2.批量修改对象集合中元素的某一属性值
二、提取集合元素值
1.提取集合中对象的某一属性,组成新集合
2.提取集合中对象的某两个属性,组成map
3.提取map的value值,组成一个集合
三、对集合元素求和
1.对List求和
2.对List求和
3.将对象集合根据某一属性求和
4.将对象集合的某一属性进行求和,元素属性名不固定,需要通过反射获取得到
四、对集合元素进行分组,再统计
1.将对象集合按照元素的某一属性进行分组,并求和某一属性,得到map
2. 将对象集合按照元素的某一属性进行分组,并统计个数,得到map
3.将对象集合按照某一属性分组,得到一个分组后的map
3.将对象集合按照某多个属性分组,得到一个分组后的map
4.将对象集合按照某属性分组,再取分组后对象某一属性组成list
五、取对象集合的属性做运算
1.将对象的某两个属性(BigDecimal类型)做乘积操作,再求和
2.将对象的某两个属性(Double类型)做乘积操作,再求和
六、集合元素去重
1.去重集合元素
2.筛选出集合中重复的元素
七、条件筛选集合
1.将对象集合按照元素的某一属性进行筛选,得到新的集合
2. 将对象集合按照元素的某一属性进行筛选,再提取某一属性组成新的集合
八、集合元素排序
1.排序List
2.将集合逆序
3.根据对象集合中元素的某一属性排序
4.根据对象集合中的多个属性排序
5.根据对象集合中元素的某一对象属性的属性排序
6.根据对象集合中元素的某一属性分组,并保证原来的排序
九、最大、最小、均值
十、注意
1.元素存在null值
2.调用方法无效
例子:操作元素为字符串的集合,做截取->操作["2021-09-01 12:00:33","2021-09-02 12:23:33"]集合,修改为["2021-09-01","2021-09-02"]
List holidayList = legalHolidays.stream().map(tmp -> {
String date = tmp.getDate();
int pos = date.indexOf(" ");
return date.substring(0, pos);
}).collect(Collectors.toList());
例子:批量修改List
方法一:
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()),否则并不会修改元素。
例子:提取List
List numList = studentList.stream().map(tmp ->
tmp.getNum()).collect(Collectors.toList());
Map elecPriceMap =
contractInfoList1.stream().collect(Collectors.toMap(Contract::getId,
Contract::getPrice));
elecMap.entrySet().stream().map(tmp ->
tmp.getValue()).collect(Collectors.toList());
totalElec += yAxis1.stream().reduce(Double::sum).orElse(0.0);
monthTotalElec = monthYAxis.stream().reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal value=
contract2List.stream().map(Contract::getPrice)
.reduce(BigDecimal.ZERO,BigDecimal::add);
注意:getPrice()值不能为null,否则会报错。
for(int i = 0; i {
//反射,取集合中各元素的某属性
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:根据日期,分组统计电量(统计的属性为double类型);list集合为空时,会返回空map;
Map theMap =
hourlyDataList.stream().collect(Collectors.groupingBy(HourlyData::getDate,
Collectors.summingDouble(HourlyData::getTotalPower)));
例子2: 根据日期,分组统计电量;(统计的属性为BigDecimal类型)
Map theMap =
quarterDataList.stream().collect(Collectors.groupingBy(QuarterData::getDate,
Collectors.reducing(BigDecimal.ZERO,QuarterData::getTotalPower,BigDecimal::add)));
描述:根据日期进行分组并统计个数。 虽然map的key和value都可以为null,但是在用getDate来分组时,getDate不能为null,否则会报错。所以在分组之前先要对list做筛选。
Map netWorkLoadCntMap =
networkLoadList.stream().collect(Collectors.groupingBy(NetworkLoad::getDate,
Collectors.counting()));
Map> 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());
Map> map =
voDataList.stream().collect(Collectors.groupingBy(item -> item.getName() + "-" +
item.getAge(), Collectors.toList()));
//根据学生姓名分组,取出分组后每组学生的年龄list
Map> map=voDataList.stream
.collect(Collectors.groupingBy(item->item.getName(),
Collectors.mapping(Student::getAge,Collectors.toList())));
BigDecimal contractTotalPrice = contractInfoList.stream().reduce(
BigDecimal.ZERO, (x, y) ->
{
return x.add(y.getTotal().multiply(y.getPrice()));
}, BigDecimal::add);
orderList.stream().reduce(0.0, (x, y) -> x + (y.getNum() * y.getPrice()),
Double::sum);
List list = Arrays.asList("xxx","vvv","xxx","yyy","zzz","vvv");
List collect = list.stream().distinct().collect(Collectors.toList());
Map collect=
strings.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
collect.forEach((k,v)->{ if(v>1) result.add(k);});
//if(v<=1)则筛选出没有重复的元素
contractInfoList = contractInfoList.stream().filter(contract ->
contract.getName().equals("xx");
).collect(Collectors.toList());
Listlist = netWorkList.stream().filter(tmp ->
theDate.equals(tmp.getDate()))
.map(NetworkLoad::getActualValue).collect(Collectors.toList());
List
注意:在调用.sorted()方法之后必须要带上.collect(Collectors.toList())并最终赋值给list,否则结果还是未排序的。
Collections.reverse(dateList);
List studentsSortName =
studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge))
.collect(Collectors.toList()
gensetClDataList = gensetClDataList.stream()//根据date先倒序、time再升序排序
.sorted(Comparator.comparing(GensetClearingData::getDate).reversed())
.sorted(Comparator.comparing(GensetClearingData::getTime)).collect(Collectors.toList());
list.stream().sorted(Comparator.comparing(
o -> o.getPerson().getAge())).collect(Collectors.toList());
Map> 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);
List 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值。
list.stream().map(item->{
Integer n = this.getNum();
return n;
});
在stream流里面写了需要调用getNum()方法,但实际上程序并不会去调用。