引言

在本文中,我们将向您展示如何使用 java8 流的 Collectors 对列表进行分组、计数、求和和排序。

1. 分组、计数和排序

  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);

输出:

{papaya=1, orange=1, banana=2, apple=3
}
  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<>();result.entrySet().stream().sorted(Entry.<String,Long>comparingByValue().reversed()).forEachOrdered(e->finalMap.put(e.getKey(),e.getValue()));System.out.println(finalMap);

输出:

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

2.列出对象

按用户定义的对象列表进行“分组”的示例。

  1. 按名称分组,并统计数量或求和。
public class Item {private String name;private int qty;private BigDecimal price;//constructors, getter/setters
}
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> couting = items.stream().collect(Collectors.groupingBy(Item::getName, Collectors.counting()));System.out.println(couting);System.out.println("======");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}
======
{papaya=20, banana=30, apple=40, orang=10, watermelon=10}
  1. 按价格分组,Collectors.groupingBy and 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")));System.out.println("=====>group by price:");// group by priceMap<BigDecimal, List<Item>> groupByPriceMap = items.stream().collect(Collectors.groupingBy(Item::getPrice));System.out.println(groupByPriceMap);Map<BigDecimal, Set<String>> collect = items.stream().collect(Collectors.groupingBy(Item::getPrice, Collectors.mapping(Item::getName, Collectors.toSet())));System.out.println("=====>group by + mapping to Set:");System.out.println(collect);

输出:

=====>group by price:
{   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]
}

源码见:java-8-demo

系列文章详见:Java 8 教程

Java8 Streams Collectors 使用相关推荐

  1. Java8 Streams用法总结大全 之 Collector用法详解

    1.前言   在<Java8 Streams用法总结大全 之 Stream中的常见操作>中,我们已经学习了Stream中的常用操作,其中也提到了collect()的用法,当时只是通过入参C ...

  2. 一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析

    写在前面的一点小吐槽.一点杂感 学 Haskell 学了一段时间之后,虽说拿他来写东西还是完全不行,但是看别的语言特性时,总是会带着一种"诶,这玩意在哪哪见过"的蜜汁既视感.且不说 ...

  3. java8 stream collectors.joining

    java8 stream collectors.joining 为承接另一篇关于Stream介绍的文章,本文将详细讲讲Java 8流(stream)收集器(Collectors)中的joining() ...

  4. java8中 Collectors.groupingBy用法

    目录 1.数据准备: 2.分组 按照类目分组: 按照几个属性拼接分组: 根据不同条件分组 3.多级分组 4.按子组收集数据 求总数 求和 把收集器的结果转换为另一种类型 联合其他收集器 Collect ...

  5. java8 groupingby_Java8 教程第五章之Streams Collectors groupingBy

    本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵. 本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧. 在j ...

  6. Java8 - Streams map()

    文章目录 概述 Case 1 : A List of Strings to Uppercase Case 2 : List of objects -> List of String Case 3 ...

  7. Java8 - Streams flatMap()

    文章目录 官方文档 What is flatMap()? Why flat a Stream? Demo 需求1:Find all books 需求2:Order and LineItems 需求3: ...

  8. Java8 Stream Collectors groupingBy使用

    分组List并显示其总数. @Test public void test8() {//3 apple, 2 banana, others 1List<String> items =Arra ...

  9. Java8中Collectors详解

    文章目录 1.averagingDouble 2.collectingAndThen 3.counting 4.groupingBy 4.1groupingBy(Function) 4.2groupi ...

最新文章

  1. BZOJ4245 : [ONTAK2015]OR-XOR
  2. 青少年蓝桥杯_2020_steam考试_中级组_第四题
  3. QComboBox样式
  4. 零食嘴----美食领域的美丽说
  5. aix 到 linux的网络,DB2从AIX server上转移(迁移)到linux上-通信/网络-与非网
  6. linux5中文支持,centos安装中文支持
  7. iOS即时通讯输入框随字数自适应高度
  8. CentOS 7安装Gnome GUI 图形界面
  9. JAVA如何插入MySql的datetime类型
  10. 使用Block在两个界面之间传值
  11. 7-7自动色阶/自动对比度/自动颜色
  12. viewUrl 终结者
  13. 计算机考研培训中公,计算机408
  14. 天涯社区脱水机(TianyaTool) - 实现天涯社区宝箱的只看楼主功能
  15. 舞台音效控制软件_舞台音乐控制软件下载
  16. 【Hyperledger Fabric】学习笔记2——超级账本介绍
  17. MEION:Costas环 环路滤波器参数设置程序
  18. 电子签名、数字签名、数字证书、电子签章、电子印章的概念和区别
  19. WPF中播放GIF图片
  20. LOX-8 Grease Paste tufoil fluoramics

热门文章

  1. win10 联想拯救者r7000 触控板无法使用
  2. SVG黑科技微信排版『左右视差滚动』模板代码
  3. unity中接入Google Play SDK
  4. [SRS+docker]实现直播服务器 8 云产商直播服务
  5. 元宇宙游戏_区块链虚拟农场茶叶种植系统,含在线商城和系统交易大厅
  6. html计算器的基本功能实现,javascript实现计算器功能
  7. 树莓派以及一些常见的硬件设备的浮点计算能力
  8. WebRTC samples
  9. 记一次被浏览器广告拦截插件坑死的经历:adp和ad插件把jsp页面中div显示的图片当作广告拦截!!
  10. 32g内存 android开发,堪比台式电脑,手机真的需要用到16G内存,32G内存何时能到来?...