Pratique de flux de flux (5) : utiliser le groupe suivi du tri par somme et d'autres opérations

Préface

Cet article utilisera plusieurs exemples pour expliquer l'utilisation de base du groupe de flux Stream par, ainsi que l'agrégation et le tri des données groupées après groupe par groupe.

1. Regrouper par calcul + résumé

1.1 Regrouper par collection et afficher les données récapitulatives finales


 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 Regroupez par collection et ajoutez-le à la nouvelle carte dans l'ordre


        //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. Collection de listes

2.1 Traitement de base des objets

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 Exemple de collecteurs.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]
}

Guess you like

Origin blog.csdn.net/qq_44716086/article/details/129862482