在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序。

1. Group By, Count and Sort

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 items =

Arrays.asList("apple", "apple", "banana",

"apple", "orange", "banana", "papaya");

Map 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 加入排序

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 items =

Arrays.asList("apple", "apple", "banana",

"apple", "orange", "banana", "papaya");

Map result =

items.stream().collect(

Collectors.groupingBy(

Function.identity(), Collectors.counting()

)

);

Map finalMap = new LinkedHashMap<>();

//Sort a map and add to finalMap

result.entrySet().stream()

.sorted(Map.Entry.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

对用户定义的对象数组进行分组的例子。

2.1 一个简单java对象.

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 通过name属性分组,并显示分组个数或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 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 counting = items.stream().collect(

Collectors.groupingBy(Item::getName, Collectors.counting()));

System.out.println(counting);

Map 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 和 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 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> groupByPriceMap =

items.stream().collect(Collectors.groupingBy(Item::getPrice));

System.out.println(groupByPriceMap);

// group by price, uses 'mapping' to convert List to Set

Map> 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

[Stackoverflow – Sort a Map by values (Java) ][Stackoverflow _ Sort a Map by values Java]

java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程相关推荐

  1. Java基础笔记-Java8及其他新特性

    第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...

  2. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  3. JAVA8 新特性-Lamda跟Stream

    JAVA8 新特性-Lamda跟Stream 主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 Jav ...

  4. java8新特性Lambda和Stream以及函数式接口等新特性介绍

    主要内容 1.Lambda 表达式 2.函数式接口 3.方法引用与构造器引用 4.Stream API 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 Java 8新特性简介 速 ...

  5. Java8新特性之三:Stream API

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  6. java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程

    在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法 1. Streams filter() 和 collect() 1.1 在 Jav ...

  7. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  8. Java8的一些新特性

    Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...

  9. jdk1.8新特性的应用-Stream 的终止操作

    jdk1.8新特性的应用-Stream 的终止操作 public class TestStreamApi4 {List<Employee> emps = Arrays.asList(new ...

最新文章

  1. 以太坊智能合约开发:让合约接受转账
  2. java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...
  3. 微信小程序,实现 watch 属性,监听数据变化
  4. element ui 组件踩坑记录--后台管理系统-最全
  5. 用Fidder实现IOS手机抓包
  6. LeetCode100 相同的树-简单
  7. 源码包安装mysql5.6_源码包安装mysql5.6
  8. 自动量策略的开发和优化
  9. vue多页面开发_使用VUE进行移动端H5页面开发前准备
  10. txtv28pw河南某中学_有一种寒冷叫不穿秋裤!河南一中学班主任让学生列队挨个检查秋裤...
  11. mysql安装显示挂起_安装Sql Server 2000时提示“安装Sql挂起”的解决方案
  12. 平面直角坐标系中的旋转公式_【初中数学大招流】从平面几何到解析几何
  13. JVM监控Jconsole
  14. R语言生存分析之COX比例风险模型构建及亚组森林图绘制示例
  15. IBM Cognos 10.2 最新体验之旅
  16. 杂谈:加班中离世的人
  17. 2021高考杭二中成绩查询,杭二中公布了首张高考成绩通报 北大清华51人
  18. 平均电流型LED降压恒流驱动器 常用恒流IC
  19. 6 生僻字_蔬菜中的生僻字你知道哪些?
  20. 三极管电路--低通滤波器

热门文章

  1. 市场份额一般是多少_一瓶500毫升的啤酒相当于多少白酒?
  2. mysql数据库多级分类汇总_sql多级分类汇总实现介绍
  3. Mac下安装Pyqt
  4. vue2.0 与 bootstrap datetimepicker的结合使用
  5. Java设计模式--总结
  6. JavaScript学习--闭包
  7. Jetty服务器jmx监控
  8. atitit..主流 浏览器 js 发动机 内核 市场份额 attialx总结vOa9
  9. Ubuntu Linux下如何配置Android开发环境
  10. 如何在您的笔记本上搭建View 演示环境 -5.配置View Connection Server