文档章节

Stream Collectors groupingBy 例子

键盘上跳舞
 键盘上跳舞
发布于 2018/03/09 16:06
字数 678
阅读 1.4W
收藏 1

在这篇文章中,我们将向您展示如何使用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]
}

References

  1. Java 8 Stream Collectors JavaDoc
  2. Java – How to sort a Map
  3. Stackoverflow – Sort a Map by values (Java)

© 著作权归作者所有

键盘上跳舞
粉丝 19
博文 69
码字总数 67256
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

java8 list转map

List转Map List转Map() List转Map List转Map> doc Ignore duplicates when producing map using streams...

go4it
2016/11/09
223
0
Java 8中Stream相关用法实践

Java 8中Stream相关用法实践(https://github.com/hollischuang/toBeTopJavaer/blob/master/basics/java-basic/stream.md) 参考示例发下: 1. jcode-java-8-streams-collectors-flatmapping(h......

近在咫尺远在天涯
2019/07/03
219
0
一起来学Java8(七)——Stream(中)

在中我们了解到了Stream对象的常用方法以及用法。现在一起来深入了解下方法的使用 collect基本用法 collect意思为收集,它是对Stream中的元素进行收集和归纳,返回一个新的集合对象。先来看一...

猿敲月下码
2019/10/31
211
0
java8函数式编程--收集器collector

java8的stream api能很方便我们对数据进行统计分类等工作,以前我们写的很多统计数据的代码往往是循环迭代得到的,不说别人看不懂,自己的代码放久了也要重新看一段时间才能看得懂。现在,j...

JoshuaShaw
2015/08/04
3.1K
2
(翻译)Java SE 8 Lambda 标准库概览(下)

Java SE 8 Lambda 标准库概览 8,Collectors 在目前的例子中,我们已经使用了collect()方法来收集流中的元素并放入List或Set中了。collec()方法的参数是一个收集器,它包含了收集或汇总多个元...

麦壳原野
2014/01/21
3.4K
16

没有更多内容

加载失败,请刷新页面

加载更多

渲染学习笔记——各种测试

1.模板测试 每个像素点都有颜色缓冲区。模板缓冲区和深度缓存区记录了像素的模板值和深度值。一个片元舍弃与否都可以更新模板缓冲区中的值。 2.深度测试 没通过深度缓冲的片元无法改变深度缓...

myctrd
20分钟前
48
0
(零)从零编写PHP容器

说明 一、前置 杂谈 关于造轮子 关于编写项目 必要知识 IOC DI Reflection * ReflectionClass * ReflectionObject * ReflectionMethod * ReflectionFunction * ReflectionProperty 拓展知识点......

calject
22分钟前
42
0
linux基础第七周

1、简述OSI七层模型和TCP/IP五层模型 物理层 在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。 物理层的主要功能是:利用传输介质为数据链路层提供物理...

大雨雨雨雨雨
24分钟前
37
0
远程桌面连接服务器工具下载页面

远程桌面连接服务器工具下载页面: 远程桌面连接工具 添加机器:

汉美丽
26分钟前
34
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部