Java 8 Stream Collectors groupingBy

展示如何使用Java 8 Stream Collectors進行分組,計數,總和和排序List

分組,計數和排序

注:輸出結果中的中文均應爲英文。

1.1分組List並顯示其總數。

Java8Example1.java

package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Java8Example1 {
    public static void main(String[] args) {
        //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()
                        )
                );
        System.out.println(result);
    }
}

Output

{
	番木瓜= 1,橙= 1,香蕉= 2,蘋果= 3
}

1.2添加排序。

Java8Example2.java

package com.mkyong.java8;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Java8Example2 {
    public static void main(String[] args) {
        //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()));
        System.out.println(finalMap);
    }
}

Output

{
	蘋果= 3,香蕉= 2,木瓜= 1,橙= 1
}

2.List Objects

“分組”用戶定義的對象列表的示例。

2.1 Pojo。

Item.java
package com.mkyong.java8;
import java.math.BigDecimal;
public class Item {
    private String name;
    private int qty;
    private BigDecimal price;
    //constructors, getter/setters
}

2.2 按姓名+數字或數量組合。

Java8Examples3.java
package com.mkyong.java8;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Java8Examples3 {
    public static void main(String[] args) {
        //3 apple, 2 banana, others 1
        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"))
        );
        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);
    }
}

Output

// Group by + Count
{
	番木瓜= 1,香蕉= 2,蘋果= 3,猩猩= 1,西瓜= 1
}

// Group by + Sum qty
{
	番木瓜= 20,香蕉= 30,蘋果= 40,orang = 10,西瓜= 10
}

2.2按價格分組 - Collectors.groupingBy以Collectors.mapping示例爲例。

Java8Examples4.java

package com.mkyong.java8;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Java8Examples4 {
    public static void main(String[] args) {
        //3 apple, 2 banana, others 1
        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"))
                );
		//group by price
        Map<BigDecimal, List<Item>> groupByPriceMap =
			items.stream().collect(Collectors.groupingBy(Item::getPrice));
        System.out.println(groupByPriceMap);
		// group by price, uses 'mapping' to convert List<Item> to Set<String>
        Map<BigDecimal, Set<String>> result =
                items.stream().collect(
                        Collectors.groupingBy(Item::getPrice,
                                Collectors.mapping(Item::getName, Collectors.toSet())
                        )
                );
        System.out.println(result);
    }
}

Output

{
	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}
		]
}

// group by +映射到Set
{
	19.99 = [香蕉] 
	29.99 = [orang,西瓜]9.99 = [番木瓜,蘋果]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章