使用lambda表達式分別 根據 單個字段、多個字段,分組求和
示意圖:
1、根據 單個字段,分組求和:根據2019這個字段,計算一個list集合里,同屬於2019的某個字段累加和
2、根據 多個字段,分組求和:
(1)先根據2019這個字段,再根據1這個字段,計算一個list集合里,同屬於2019和1的某個字段累加和;
(2)先根據2019這個字段,再根據2這個字段,計算一個list集合里,同屬於2019和2的某個字段累加和;
代碼如下:
import com.pojo.DataStatisticsResultMiddle;
import java.util.ArrayList;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.Map;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
List<DataStatisticsResultMiddle> li = new ArrayList<>();
DataStatisticsResultMiddle middle1 = new DataStatisticsResultMiddle();
middle1.setDatas("2019");
middle1.setCarrierid("1");
middle1.setEnusers(100L);
DataStatisticsResultMiddle middle2 = new DataStatisticsResultMiddle();
middle2.setDatas("2019");
middle2.setCarrierid("1");
middle2.setEnusers(150L);
DataStatisticsResultMiddle middle3 = new DataStatisticsResultMiddle();
middle3.setDatas("2019");
middle3.setCarrierid("1");
middle3.setEnusers(200L);
DataStatisticsResultMiddle middle4 = new DataStatisticsResultMiddle();
middle4.setDatas("2019");
middle4.setCarrierid("2");
middle4.setEnusers(400L);
DataStatisticsResultMiddle middle5 = new DataStatisticsResultMiddle();
middle5.setDatas("2019");
middle5.setCarrierid("2");
middle5.setEnusers(500L);
DataStatisticsResultMiddle middle6 = new DataStatisticsResultMiddle();
middle6.setDatas("2019");
middle6.setCarrierid("2");
middle6.setEnusers(600L);
li.add(middle1);
li.add(middle2);
li.add(middle3);
li.add(middle4);
li.add(middle5);
li.add(middle6);
//單個字段,分組求和(datas)
Map<String, LongSummaryStatistics> enusersCollect1 =
li.stream().collect(Collectors.groupingBy(DataStatisticsResultMiddle:: getDatas, Collectors.summarizingLong(DataStatisticsResultMiddle :: getEnusers)));
LongSummaryStatistics enusers = enusersCollect1.get("2019");
System.out.println(enusers.getSum());
System.out.println("分割線***********************************");
//多個字段,分組求和(先按datas分組,再按Carrierid分組,求和)
Map<String, Map<String, LongSummaryStatistics>> enusersCollect2 =
li.stream().collect(Collectors.groupingBy(DataStatisticsResultMiddle:: getDatas,
Collectors.groupingBy(DataStatisticsResultMiddle:: getCarrierid,
Collectors.summarizingLong(DataStatisticsResultMiddle :: getEnusers))));
Map<String, LongSummaryStatistics> map = enusersCollect2.get("2019");
for(Map.Entry<String, LongSummaryStatistics> entry : map.entrySet()){
System.out.println(entry.getKey());
System.out.println(entry.getValue().getSum());
}
}
}
輸出結果如下: