Java8分组(groupingBy)
Posted 风坤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8分组(groupingBy)相关的知识,希望对你有一定的参考价值。
1、分组,计数,排序
public class Java8Example1 { public static void main(String[] args) { List<String> items = Arrays.asList( "apple", "apple", "orange", "orange", "orange", "blueberry", "peach", "peach", "peach", "peach" ); // 分组,计数 Map<String, Long> result = items.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); System.out.println(result); Map<String, Long> finalMap = new LinkedHashMap<>(); // 排序 result.entrySet().stream() .sorted(Map.Entry.<String, Long>comparingByValue().reversed()) .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue())); System.out.println(finalMap); } }
2、以下例子使用的类
public class Item { private String name; private int qty; private BigDecimal price; public Item() { } public Item(String name, int qty, BigDecimal price) { this.name = name; this.qty = qty; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getQty() { return qty; } public void setQty(int qty) { this.qty = qty; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } @Override public String toString() { return "Item{" + "name=‘" + name + ‘‘‘ + ", qty=" + qty + ", price=" + price + ‘}‘; } }
3、分组,计数,计算数量
public class Java8Example2 { public static void main(String[] args) { List<Item> items = Arrays.asList( new Item("apple", 10, new BigDecimal(23.5)), new Item("apple", 20, new BigDecimal(32.5)), new Item("orange", 30, new BigDecimal(13.9)), new Item("orange", 20, new BigDecimal(33.5)), new Item("orange", 10, new BigDecimal(63.5)), new Item("orange", 50, new BigDecimal(41.5)), new Item("peach", 20, new BigDecimal(26.5)), new Item("peach", 30, new BigDecimal(42.5)), new Item("peach", 40, new BigDecimal(24.5)), new Item("peach", 10, new BigDecimal(12.5)) ); // 分组,计数 Map<String, Long> counting = items.stream() .collect(Collectors.groupingBy(Item::getName, Collectors.counting())); System.out.println(counting); // 分组,计数,数量 Map<String, Integer> sum = items.stream() .collect(Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty))); System.out.println(sum); } }
4、通过价格分组
public class Java8Example3 { public static void main(String[] args) { List<Item> items = Arrays.asList( new Item("apple", 10, new BigDecimal(23.5)), new Item("apple", 20, new BigDecimal(32.5)), new Item("orange", 30, new BigDecimal(13.9)), new Item("orange", 20, new BigDecimal(32.5)), new Item("orange", 10, new BigDecimal(63.5)), new Item("orange", 50, new BigDecimal(41.5)), new Item("peach", 20, new BigDecimal(26.5)), new Item("peach", 30, new BigDecimal(32.5)), new Item("peach", 40, new BigDecimal(24.5)), new Item("peach", 10, new BigDecimal(12.5)) ); // 分组 Map<BigDecimal, List<Item>> groupByPriceMap = items.stream() .collect(Collectors.groupingBy(Item::getPrice)); System.out.println(groupByPriceMap); // 分组 转化List->Set Map<BigDecimal, Set<String>> result = items.stream() .collect(Collectors.groupingBy(Item::getPrice, Collectors.mapping(Item::getName, Collectors.toSet()))); System.out.println(result); } }
以上是关于Java8分组(groupingBy)的主要内容,如果未能解决你的问题,请参考以下文章
java8中的Collectors.groupingBy进行分组用法
Java8 stream 中利用 groupingBy 进行多字段分组
Java8 Stream针对List先分组再求和最大值最小值平均值等