背景:希望List  可以根据某个字段 进行分组 然后拆分

使用Java 8 的流来做。

java.util.stream.Collectors#groupingBy(java.util.function.Function super T,? extends K>, java.util.stream.Collector super T,A,D>)

使用Group By 方法 默认会转换为 List

可以看到 默认是使用toList()

classifer 是返回的Map的Key 。

groupingBy(Function super T, ? extends K> classifier) {

return groupingBy(classifier, toList());

}

public static

Collector> groupingBy(Function super T, ? extends K> classifier,

Collector super T, A, D> downstream) {

return groupingBy(classifier, HashMap::new, downstream);

}

这个可以提供转换的downStream,变成希望的类型。

public static >

Collector groupingBy(Function super T, ? extends K> classifier,

Supplier mapFactory,

Collector super T, A, D> downstream)

好了 来几个例子吧:

TestPerson 类, List 存储的是这个对象

private static classTestPerson {

String userName;intid;intage;public TestPerson(String userName, int id, intage) {this.userName =userName;this.id =id;this.age =age;

}publicString getUserName() {returnuserName;

}public voidsetUserName(String userName) {this.userName =userName;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "TestPerson{" +

"userName='" + userName + '\'' +

", id=" + id +

", age=" + age +

'}';

}

}

}

List 中 存储一些对象

List persons = Arrays.asList(

new TestPerson("zhangsan",1,20),

new TestPerson("lisi",2,21),

new TestPerson("wangwu",3,20)

);

案例1 :根据Age 分组,并且拆分成两个group

Map> personPerAge = persons.stream().collect(groupingBy(TestPerson::getAge));

System.out.println("分成了"+personPerAge.size()+"组");

for(List personList : personPerAge.values()) {

System.out.println("One group:");

for(TestPerson person :personList){

System.out.println(person);

}

}

console:

分成了 2组

One group:

TestPerson{userName='zhangsan', id=1, age=20}

TestPerson{userName='wangwu', id=3, age=20}

One group:

TestPerson{userName='lisi', id=2, age=21}

案例2 :   根据一个对象进行分组,

假设每个人都有个班级或者等级吧 , 这个时候我希望 同时加上这个班级的名称 进行分组

private static classTestClass{privateTestPerson person;privateString className;publicTestPerson getPerson() {returnperson;

}public voidsetPerson(TestPerson person) {this.person =person;

}publicString getClassName() {returnclassName;

}public voidsetClassName(String className) {this.className =className;

}

}

案例3 可以拿到每组中的最大值,平均值,最小值等等 ,是不是和数据库很像?

public static voidmain(String[] args) {

TestPerson zhangsan= new TestPerson("zhangsan",1,18);

TestPerson lisi= new TestPerson("lisi", 1, 19);

TestPerson wangwu= new TestPerson("wangwu", 2, 20);

TestPerson wangwu1= new TestPerson("wangwu1", 2, 21);/*List classes = Arrays.asList(

new TestClass(zhangsan,"A"),

new TestClass(zhangsan,"B"),

new TestClass(wangwu,"C")

);

Map> classPerPerson = classes.stream().collect(groupingBy(TestClass :: getPerson));

System.out.println("分成了"+classPerPerson.size()+"组");

for(List classList : classPerPerson.values()) {

System.out.println("One group:");

for(TestClass clazz : classList){

System.out.println(clazz);

}

}*/List persons =Arrays.asList(

zhangsan,

lisi,

wangwu,

wangwu1

);

Map personPerAge =persons.stream().collect(groupingBy(TestPerson::getId, summarizingInt(TestPerson::getAge)));

personPerAge.forEach((k,v)->

System.out.println("This group id is "+k+" and the summary is " +v)

);

}

对 后面我使用了forEach 和Lamda 表达式 一起配合使用,

当然 还支持过滤功能 ,大家可以一起来玩哈。

参考文章:

https://www.baeldung.com/java-groupingby-collector

https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/index.html

java拆分list_Java 8 stream 流 拆分list相关推荐

  1. java8 拆分list_Java 8 stream 流 拆分list

    背景:希望List  可以根据某个字段 进行分组 然后拆分 使用Java 8 的流来做. java.util.stream.Collectors#groupingBy(java.util.functi ...

  2. java 新特性之 stream 流

    java 新特性之 stream 流 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在 ...

  3. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  4. java 合并流_Java Stream 流实现合并操作示例

    本文实例讲述了Java Stream 流实现合并操作.分享给大家供大家参考,具体如下: 1. 前言 Java Stream Api提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为 ...

  5. Java JDK8新特性Stream流

    1.Stream流 1. 流,支持处理数据处理操作的源生成的元素序列.流有两个重要特性:1流水线:很多流操作本身会返回一个流,这样多的操作就可以链接起来,形成一个大的流水线.2,内部迭代.流的迭代是在 ...

  6. java(九)-方法引用, Stream流,File类 , 递归 ,字节流

    day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...

  7. java 合并流_Java Stream 流如何进行合并操作

    1. 前言 Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作.今天我们来看看如何合并 Stream 流. 2. Stream 流的合并 ...

  8. Java函数式编程学习——Stream流

    目录 概述 案例数据准备 1. 常用操作 2. 中间操作 filter map distinct sorted limit skip flatMap 3. 终结操作 foreach count max ...

  9. java 1.8stream_java jdk1.8 使用stream流进行list 分组归类操作

    我就废话不多说了,大家还是直接看代码吧~ import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util. ...

最新文章

  1. 使用扩展方法和静态门面类实现伪领域对象
  2. 从睡姿就可以看出你的性格,据说非常准,快存!
  3. 百度面试 中缀表达式变成后缀表达式
  4. python下载教程1001python下载教程-Python知识圈
  5. python抓取头条文章
  6. 虚拟化何以四两拨千斤
  7. 这个回答让我错失offer!成功收获美团,小米安卓offer
  8. mediainfo php,media.php
  9. zabbix学习笔记(1)
  10. 系统学习深度学习(九)--激活函数总结
  11. 九度OJ 1068:球的半径和体积 (基础题)
  12. html静态网页实例一(附完整代码)
  13. 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
  14. 寂静岭2java攻略_寂静岭2攻略
  15. 玩转Qml(18)-用户向导
  16. 什么是数据库中的一对一关系?
  17. 独家对话徐翔妻子:我为什么起诉离婚
  18. 1397 火车票退票费计算(函数专题)
  19. vue用路由守卫进行登录后的路由跳转
  20. 单相PWM整流器的数学模型、工作原理

热门文章

  1. 蓝奏云PHP解析接口,蓝奏云下载地址解析API[直链]
  2. 博客中的动态图片如何制作
  3. linux线程亲和性,线程亲和性
  4. p40华为鸿蒙系统gms服务,华为P40确定:告别鸿蒙系统,告别谷歌GMS,转用使用HMS...
  5. python微信爬取教程_python爬取微信文章方法
  6. 力扣题解: 55. 跳跃游戏
  7. 文本分割之垂直投影法基于OpenCV(python)的实现
  8. office2007的Excel当中如何打开两个独立窗口
  9. <<视觉问答>>2021:Zero-shot Visual Question Answering usingKnowledge Graph
  10. 读书笔记 - 学会写作: 什么是写作?