JAVA8使用stream()根据ID对List进行分组统计
Apple类:
/** * @version: V1.0 * @author: fendo * @className: Apple * @packageName: com.xxx.xxxx.xxxx.xxxx * @description: 苹果 * @data: 2018-06-11 11:15 **/ public class Apple { /** * 主键 */ private String id; /** * 名称 */ private String name; /** * 价格 */ private BigDecimal price; /** * 总数 */ private Long count; /** * 类别 */ private String type; public Apple() { } public Apple(String id, String name, BigDecimal price, Long count) { this.id = id; this.name = name; this.price = price; this.count = count; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public Long getCount() { return count; } public void setCount(Long count) { this.count = count; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
测试类:
public static void main(String[] args) { List<Apple> appleList = Lists.newArrayList(); Apple apple1 = new Apple(); apple1.setId("1"); apple1.setName("fendo1"); apple1.setCount((long) 10); apple1.setType("1"); apple1.setPrice(new BigDecimal(20)); appleList.add(apple1); Apple apple2 = new Apple(); apple2.setId("2"); apple2.setName("fendo2"); apple2.setCount((long) 10); apple2.setType("1"); apple2.setPrice(new BigDecimal(20)); appleList.add(apple2); Apple apple6 = new Apple(); apple6.setId("6"); apple6.setName("fendo6"); apple6.setCount((long) 30); apple6.setType("1"); apple6.setPrice(new BigDecimal(20)); appleList.add(apple6); Apple apple3 = new Apple(); apple3.setId("3"); apple3.setName("fendo3"); apple3.setCount((long) 10); apple3.setType("2"); apple3.setPrice(new BigDecimal(20)); appleList.add(apple3); Apple apple4 = new Apple(); apple4.setId("4"); apple4.setName("fendo4"); apple4.setCount((long) 10); apple4.setType("3"); apple4.setPrice(new BigDecimal(20)); appleList.add(apple4); Apple apple5 = new Apple(); apple5.setId("5"); apple5.setName("fendo5"); apple5.setCount((long) 10); apple5.setType("4"); apple5.setPrice(new BigDecimal(20)); appleList.add(apple5); //分组 Map<String,List<Apple>> map = appleList.stream().collect(Collectors.groupingBy(Apple::getType)); for (Map.Entry<String, List<Apple>> entry : map.entrySet()) { System.out.println("分组" + JsonUtil.toJson(entry)); } //分组求和 Map<String, LongSummaryStatistics> collect = appleList.stream().collect( Collectors.groupingBy(Apple::getType, Collectors.summarizingLong(Apple::getCount))); 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()); } }
输出如下:
分组 { "key": "1", "value": [{ "id": "1", "name": "fendo1", "price": 20, "count": 10, "type": "1" }, { "id": "2", "name": "fendo2", "price": 20, "count": 10, "type": "1" }, { "id": "6", "name": "fendo6", "price": 20, "count": 30, "type": "1" }] } 分组 { "key": "2", "value": [{ "id": "3", "name": "fendo3", "price": 20, "count": 10, "type": "2" }] } 分组 { "key": "3", "value": [{ "id": "4", "name": "fendo4", "price": 20, "count": 10, "type": "3" }] } 分组 { "key": "4", "value": [{ "id": "5", "name": "fendo5", "price": 20, "count": 10, "type": "4" }] } ----------------key----------------1 求和:50 求平均16.666666666666668 求最大:30 求最小:10 求总数:3 ----------------key----------------2 求和:10 求平均10.0 求最大:10 求最小:10 求总数:1 ----------------key----------------3 求和:10 求平均10.0 求最大:10 求最小:10 求总数:1 ----------------key----------------4 求和:10 求平均10.0 求最大:10 求最小:10 求总数:1