首页 > 编程语言 > 详细

Java8 --GroupingBy

时间:2021-08-10 11:05:27      阅读:32      评论:0      收藏:0      [点我收藏+]

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;

/**
* GroupingBy 功能:按单个属性、多个属性,条件分组、多级分组、分组后组装成其他集合
*/
public class Collectors01 {
public static void main(String[] args) {

Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod1_1 = new Product(11L, 11, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(3L, 3, new BigDecimal("30"), "月饼", "零食");
Product prod4 = new Product(4L, 3, new BigDecimal("10"), "青岛啤酒", "啤酒");
Product prod5 = new Product(5L, 10, new BigDecimal("15"), "百威啤酒", "啤酒");


List<Product> prodList = Arrays.asList(prod1, prod1_1, prod2, prod3, prod4, prod5);

// 从 Optional 实例中取回实际值对象的方法之一是使用 get() 方法:
// 取出集合对象中某个属性值最大的元素
Product collect = prodList.stream().collect(Collectors.
collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Product::getNum)),
Optional::get));
System.out.println(collect);

System.out.println("------------------------------------------");
//1.按某个属性值进行分组
Map<String,List<Product>> productMap =
prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
System.out.println(JSON.toJSONString(productMap));
System.out.println("------------------------------------------");

//2.按多个属性进行分组
Map<String, List<Product>> collect1 =
prodList.stream().collect(Collectors.groupingBy(x -> x.getCategory() + "_" + x.getName()));
System.out.println(JSON.toJSONString(collect1));
System.out.println("------------------------------------------");

int num = 3;
//3.按条件进行分组
Map<String, List<Product>> collect2 = prodList.stream().collect(Collectors.groupingBy(x -> {
if (x.getNum() < num) {
return "3";
} else {
return "other";
}
}));

System.out.println(JSON.toJSONString(collect2));
System.out.println("------------------------------------------");

//4.多级分组
Map<String, Map<String, List<Product>>> collect3 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.groupingBy(x -> {
if (x.getNum() < num) {
return "3";
} else {
return "other";
}
})));
System.out.println(JSON.toJSONString(collect3));
System.out.println("------------------------------------------");

//5.根据category进行分组,在根据 Num进行求和
Map<String, Integer> collect4 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.summingInt(Product::getNum)));
System.out.println(JSON.toJSONString(collect4));//{"啤酒":13,"零食":17}
System.out.println("------------------------------------------");

//6.分组后只获取最大值
// collectingAndThen ------根据对象的属性进行去重操作
Map<String, Product> collect5 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Product::getNum))
, Optional::get)));
System.out.println(JSON.toJSONString(collect5));
System.out.println("------------------------------------------");

//分组后组装成其他集合
Map<String, Set<Product>> collect6 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory,
Collectors.toSet()));
System.out.println(JSON.toJSONString(collect6));


}
}

Product(id=11, num=11, price=15.5, name=面包, category=零食)
------------------------------------------
{"啤酒":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"零食":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":11,"name":"面包","num":11,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20},{"category":"零食","id":3,"name":"月饼","num":3,"price":30}]}
------------------------------------------
{"零食_月饼":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30}],"零食_面包":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":11,"name":"面包","num":11,"price":15.5}],"啤酒_百威啤酒":[{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"啤酒_青岛啤酒":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10}],"零食_饼干":[{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}
------------------------------------------
{"other":[{"category":"零食","id":11,"name":"面包","num":11,"price":15.5},{"category":"零食","id":3,"name":"月饼","num":3,"price":30},{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"3":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}
------------------------------------------
{"啤酒":{"other":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}]},"零食":{"other":[{"category":"零食","id":11,"name":"面包","num":11,"price":15.5},{"category":"零食","id":3,"name":"月饼","num":3,"price":30}],"3":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}}
------------------------------------------
{"啤酒":13,"零食":17}
------------------------------------------
{"啤酒":{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15},"零食":{"category":"零食","id":11,"name":"面包","num":11,"price":15.5}}
------------------------------------------
{"啤酒":[{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15},{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10}],"零食":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30},{"category":"零食","id":11,"name":"面包","num":11,"price":15.5},{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}

 

Java8 --GroupingBy

原文:https://www.cnblogs.com/jw-t/p/15121449.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!