集合数据分组很多在实际开发过程中是相当常见,比如传给前端的产品数据按照类型进行分组。最常见的方式是遍历整个集合,然后通过判断类型构造存储不同类型的集合。那么有没有更好的办法,Java8 groupingBy
能帮到我们。
同样地, 假如我们有一个类Product
,如下面的代码所示。
@Getter
@Setter
@ToString
@Builder
class Product{
private Long id;
private String category;
private String name;
private int count;
}
复制代码
我们现在获取到了List<Product>
格式的数据。
static List<Product> getList(){
final List<Product> productList = new ArrayList<>(100);
for(int i =1;i<=100;i++){
productList.add(Product.builder()
.id((long) i)
.name("name"+i)
.category("category"+i%9)
.count(i)
.build());
}
return productList;
}
复制代码
接下来我们对这个数据进行一些复杂的处理。
按照category
类型进行分组。
final Map<String, List<Product>> maps = productList.stream()
.collect(Collectors.groupingBy(Product::getCategory));
复制代码
这里对于 Collectors.groupingBy
的参数 Function<? super T, ? extends K> classifier
的返回值作为Key 。
按照category
类型进行分组,并且统计每个类型的count
总数。
Map<String, Integer> maps = productList.stream()
.collect(Collectors.groupingBy(Product::getCategory, summingInt(Product::getCount)));
复制代码
按照上面的代码就能得到从分组结果中得到总和。这上面是聚合操作,如果要做筛选操作,比如查看类型分组下数量最多的产品怎么做?
用maxBy(comparingInt(*))
即可。
Map<String, Optional<Product>> maps = productList.stream()
.collect(Collectors.groupingBy(Product::getCategory, maxBy(comparingInt(Product::getCount))));
复制代码
用这些JDK现有的方法,在内存中转化数据的格式,能极大的提高开发效率。
本文系转载,前往查看
如有侵权,请联系?cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系?cloudcommunity@tencent.com 删除。