5.JDK8中Stream流常用方法操作总结(详细)

5.JDK8中Stream流常用方法操作总结(详细)java8Stream流常用方法举例

5.JDK8中Stream流常用方法操作总结(详细)"

目录

一、修改集合元素

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.调用方法无效


一、修改集合元素

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注