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); } }