Java8 Stream针对List先分组再求和、最大值、最小值、平均值等
解题思路:JAVA8使用stream()根据类型对List进行分组统计。
核心功能代码片段:
//分组求和
Map<String, LongSummaryStatistics> collect = list.stream().collect(
Collectors.groupingBy(Fruit::getType,
Collectors.summarizingLong(Fruit::getTotal)));
for (Map.Entry<String, LongSummaryStatistics> entry : collect.entrySet()) {
LongSummaryStatistics longSummaryStatistics = entry.getValue();
System.out.println("----------------key----------------" + entry.getKey());
System.out.println("求和:" + longSummaryStatistics.getSum());
System.out.println("求平均" + longSummaryStatistics.getAverage());
System.out.println("求最大:" + longSummaryStatistics.getMax());
System.out.println("求最小:" + longSummaryStatistics.getMin());
System.out.println("求总数:" + longSummaryStatistics.getCount());
}
演示功能代码:
package com.zzg.test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.Map;
import java.util.stream.Collectors;
import cn.hutool.json.JSONUtil;
/**
* 基于Java8 分组再统计
* @author zzg
*
*/
public class GroupByStatissticsTest {
static List<Fruit> initDate(){
List<Fruit> list = new ArrayList<Fruit>();
Fruit one = new Fruit();
one.setName("苹果一级");
one.setSid("1");
one.setPrice(new BigDecimal("123456.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
one.setTotal(1100L);
one.setType("1");
Fruit two = new Fruit();
two.setName("苹果二级");
two.setSid("2");
two.setPrice(new BigDecimal("123546.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
two.setTotal(89L);
two.setType("1");
Fruit three = new Fruit();
three.setName("苹果三级");
three.setSid("3");
three.setPrice(new BigDecimal("987.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
three.setTotal(1039L);
three.setType("1");
Fruit four = new Fruit();
four.setName("梨子一级");
four.setSid("4");
four.setPrice(new BigDecimal("97.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
four.setTotal(39L);
four.setType("2");
Fruit five = new Fruit();
five.setName("梨子二级");
five.setSid("5");
five.setPrice(new BigDecimal("970.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
five.setTotal(399L);
five.setType("2");
Fruit six = new Fruit();
six.setName("西瓜一级");
six.setSid("6");
six.setPrice(new BigDecimal("1970.98").setScale(BigDecimal.ROUND_HALF_UP, 2) );
six.setTotal(2399L);
six.setType("3");
list.add(one);
list.add(two);
list.add(three);
list.add(four);
list.add(five);
list.add(six);
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Fruit> list = initDate();
//分组
Map<String,List<Fruit>> map = list.stream().collect(Collectors.groupingBy(Fruit::getType));
for (Map.Entry<String, List<Fruit>> entry : map.entrySet()) {
System.out.println("分组" + JSONUtil.toJsonStr(entry));
}
//分组求和
Map<String, LongSummaryStatistics> collect = list.stream().collect(
Collectors.groupingBy(Fruit::getType,
Collectors.summarizingLong(Fruit::getTotal)));
for (Map.Entry<String, LongSummaryStatistics> entry : collect.entrySet()) {
LongSummaryStatistics longSummaryStatistics = entry.getValue();
System.out.println("----------------key----------------" + entry.getKey());
System.out.println("求和:" + longSummaryStatistics.getSum());
System.out.println("求平均" + longSummaryStatistics.getAverage());
System.out.println("求最大:" + longSummaryStatistics.getMax());
System.out.println("求最小:" + longSummaryStatistics.getMin());
System.out.println("求总数:" + longSummaryStatistics.getCount());
}
}
static class Fruit{
private String sid;
private String name;
private String type;
private Long total;
private BigDecimal price;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
}
效果截图:
还没有评论,来说两句吧...