JAVA8 stream流操作List集合处理数据

1.从List中取某一属性

场景:从数据库从查出用户信息的集合,其中有身份证号属性需进行脱敏处理

//将JSON格式的出参转换成list
List<VO> rows = (List<VO>)JSONResult.getRows();
//对List进行stream流操作
//Util.idCardNum 工具类,将18位身份照号中间几位数字转化为*号
List<VO> resultList = rows.stream.map(e ->{
      e.setIdCard(Util.idCardNum(e.getIdCard()));
      return e;}).collect(Collectors.toList());
//将操作后的List转化为JSON返回
jsonResult.setRows(resultList);
return jsonResult;

2.将list中某一属性求和

场景:从数据库中取出List集合,level属性对应number有多少个,出参需返回其number总数

{
    "data": {
        "vo": [
            {
                "level": "B",
                "number": 7
            },
            {
                "level": "A",
                "number": 18
            },
            {
                "level": "C",
                "number": 2
            }
        ],
        "total": 27
    },
}
//mapper层操作数据库得到list集合
List<VO> list = mapper.getxxx();
//stream操作list将number进行求和得到total
Integer total = list.stream().mapToInt(VO::getNumber).sum();

3.合并两个属性都相同的List

List<VO> list = new ArrayList<>();
Stream.of(list1 , list2).forEach(list::addAll);

4.相对复杂的操作

⑴.SQL查出一个list:

monthcitytotal
9北京5
9上海5
10南京4
11广州10

需要进行的操作是:1.给list中每个city设置一个标记位flag,如1表示北京,2.表示上海,3表示南京,得到一个新的list:

monthcitytotalflag
9北京51
9上海52
10南京43
11广州104

在少量数据的情况下,这一步操作直接使用for循环即可得到

⑵.根据月份分组,将total求和

①.首先定义一个转换类,将list中的month和total进行转换:

private voResult convert(Vo vo){
  voResult result = new voResult();
  result.month = vo.getMonth();
  result.total = vo.getTotal();
}
/**
*将list根据月份分组,并求total的和,
*得到的Map:key为月份,value为total的和
*/
Map<Integer , Integer> collect = list.stream().map(this::convert)
               .collect(Collectors.groupingBy(voResult::getMonth,Collectors.summingInt(voResult::getTotal)));

版权声明:本文为c4013原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。