首页 » 生活 » 正文

Stream Collectors groupingBy 例子

Stream Collectors groupingBy 例子 

转载:https://my.oschina.net/LiuLangEr/blog/1632378

 键盘上跳舞 发布于 03/09 16:06 

在这篇文章中,我们将向您展示如何使用java 8  Stream Collectors 对列表分组,计数,求和和排序。

1. Group By, Count and Sort

1.1 Group by a List and display the total count of it.(按列表分组,并显示其总数)

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

{

    papaya=1, orange=1, banana=2, apple=3

}

1.2 Add sorting.(增加排序实现)

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

{

    apple=3, banana=2, papaya=1, orange=1

}

2. List Objects

Examples to ‘group by’ a list of user defined Objects.(通过“用户定义的对象”列表进行分组的示例。)

2.1 A 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 Group by the name + Count or Sum the Qty. (name + Count分组或者 对 Qty求和分组)

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

{

    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  Price 分组 – Collectors.groupingBy and 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 + mapping to Set

{

    19.99=[banana],

    29.99=[orang, watermelon],

    9.99=[papaya, apple]

}

© 著作权归作者所有

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据