Stream流实践(五):使用group by然后紧跟sum sort等操作

前言

本文会用几个例子去讲解Stream流 group by基本用法,以及group by分组之后对于分组数据的汇总、排序等操作

1、 Group By 计算+ 汇总

1.1 Group by 集合,并展示最后的汇总数据


 List<String> items =
                Arrays.asList("apple", "apple", "banana",
                        "apple", "orange", "banana", "papaya");

        Map<String, Long> result =
                items.stream().collect(
                        Collectors.groupingBy(
                        //Function.identity()-》指向本身
                        //Collectors.counting() 汇总个数
                                Function.identity(), Collectors.counting()
                        )
                );

//结果
papaya=1, orange=1, banana=2, apple=3      

1.2 Group by 集合,并且将他按顺序加入到新Map中去


        //3 apple, 2 banana, others 1
        List<String> items =
                Arrays.asList("apple", "apple", "banana",
                        "apple", "orange", "banana", "papaya");

        Map<String, Long> result =
                items.stream().collect(
                        Collectors.groupingBy(
                                Function.identity(), Collectors.counting()
                        )
                );

        Map<String, Long> finalMap = new LinkedHashMap<>();

        //Sort a map and add to finalMap
        result.entrySet().stream()
                .sorted(Map.Entry.<String, Long>comparingByValue()
                        .reversed()).forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));

//结果
apple=3, banana=2, papaya=1, orange=1

2、List 集合

2.1 对象的基本处理

public class Item {
    
    

    private String name;
    private int qty;
    private BigDecimal price;
}

 List<Item> items = Arrays.asList(
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 20, new BigDecimal("19.99")),
                new Item("orang", 10, new BigDecimal("29.99")),
                new Item("watermelon", 10, new BigDecimal("29.99")),
                new Item("papaya", 20, new BigDecimal("9.99")),
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 10, new BigDecimal("19.99")),
                new Item("apple", 20, new BigDecimal("9.99"))
        );

//先针对name属性分组,然后计算总数
        Map<String, Long> counting = items.stream().collect(
                Collectors.groupingBy(Item::getName, Collectors.counting()));

        System.out.println(counting);

//先针对name属性分组,然后根据Qty属性进行求和
        Map<String, Integer> sum = items.stream().collect(
                Collectors.groupingBy(Item::getName, Collectors.summingInt(Item::getQty)));

        System.out.println(sum);
//结果
{
    
    
	papaya=1, banana=2, apple=3, orang=1, watermelon=1
}

//Group by + Sum qty
{
    
    
	papaya=20, banana=30, apple=40, orang=10, watermelon=10
}

2.2 Collectors.mapping 的例子

    List<Item> items = Arrays.asList(
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 20, new BigDecimal("19.99")),
                new Item("orang", 10, new BigDecimal("29.99")),
                new Item("watermelon", 10, new BigDecimal("29.99")),
                new Item("papaya", 20, new BigDecimal("9.99")),
                new Item("apple", 10, new BigDecimal("9.99")),
                new Item("banana", 10, new BigDecimal("19.99")),
                new Item("apple", 20, new BigDecimal("9.99"))
                );

		//根据price分组
        Map<BigDecimal, List<Item>> groupByPriceMap = 
			items.stream().collect(Collectors.groupingBy(Item::getPrice));

        System.out.println(groupByPriceMap);

		//先根据price分组 然后再将分好组的数据,通过Collectors.mapping再一次把name放入set中(mappinng 使得 List -> set)
        Map<BigDecimal, Set<String>> result =
                items.stream().collect(
                        Collectors.groupingBy(Item::getPrice,
                                Collectors.mapping(Item::getName, Collectors.toSet())
                        )
                );

        System.out.println(result);
//结果
        	19.99=[
			Item{
    
    name='banana', qty=20, price=19.99}, 
			Item{
    
    name='banana', qty=10, price=19.99}
		], 
			29.99=[
			Item{
    
    name='orang', qty=10, price=29.99}, 
			Item{
    
    name='watermelon', qty=10, price=29.99}
		], 
			9.99=[
			Item{
    
    name='apple', qty=10, price=9.99}, 
			Item{
    
    name='papaya', qty=20, price=9.99}, 
			Item{
    
    name='apple', qty=10, price=9.99}, 
			Item{
    
    name='apple', qty=20, price=9.99}
		]
}

//通过mapping转变为set
{
    
    
	19.99=[banana], 
	29.99=[orang, watermelon], 
	9.99=[papaya, apple]
}

猜你喜欢

转载自blog.csdn.net/qq_44716086/article/details/129862482