背景:希望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

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

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

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

  2. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

  3. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

  4. Java8新特性之Stream流式编程

    特地感谢鲁班大叔的分享,原学习地址:Java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝 以下是学习过程整理的笔记 1.简介 Stream 流处理,首先要澄清的是 java8 中的 ...

  5. java8新特性之Stream流

    一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...

  6. Java8新特性-使用Stream流来实现递归遍历树形结构(案例)

    Java8新特性-Stream流 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来 ...

  7. Java8函数式编程、Stream流、Option的使用,一篇足够了

    为什么要学 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 // 查询未成年作家的评分在70以上的书籍 List<Book> bookList = new ArrayList<& ...

  8. Java8 方法引用和Stream流

    Stream 流API 什么是流 流的操作种类 流的操作过程 使用流 创建流 集合 数组 值 筛选 filter 去重 distinct 截取 limit 跳过 skip 映射 map 合并多个流 是 ...

  9. java8函数式编程之Stream流处理的方法和案例讲解

    函数式编程最早是数学家阿隆佐·邱奇研究的一套函数变换逻辑,又称Lambda Calculus(λ-Calculus),所以也经常把函数式编程称为Lambda计算. 为什么Java需要Lambda表达式 ...

最新文章

  1. XP局域网访问无权限、不能互相访问问题的完整解决方案
  2. 反射型XSS漏洞的条件+类型+危害+解决
  3. mysql简单分表_mysql分区分表哪个好
  4. php sqlite id自增,Android sqlite设置主键自增长的方法教程
  5. 博弈论 斯坦福game theory stanford week 3.2_
  6. 【Java】Socket多客户端Client-Server聊天程序
  7. 上海交大MBA学费与资助
  8. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)
  9. 这个星期压力貌似比较大啊!
  10. iqooneo系统要不要更新_手机系统要不要升级?别纠结,1分钟看完你就知道
  11. android 100以内的随机数
  12. 远程桌面与本计算机共享文件,win7系统开启远程桌面共享文件的方法
  13. matlab中划分训练集和测试集
  14. 小米平板2刷哪个系统更流畅_两个系统随你选 小米平板2刷机小教程
  15. 计算机提示没有有效的ip配置,教大家电脑提示以太网没有有效的ip配置怎么办...
  16. /usr/bin/ld cannot find -lGL
  17. 大都会人寿线下培训第三天回顾
  18. Linux use apktool problem
  19. 企业公众号做内容输出有哪些要点
  20. 一文理解Flink 水位线(Flink Watermark)

热门文章

  1. 咏春拳谱之标指(套路详解)
  2. Windows驱动_WSK驱动之二WSK的操作
  3. 公司(视频 社交)项目分享
  4. 10个营销中常见的用户心理效应
  5. 怎么查看服务器支持php,php怎么查看本地服务器配置信息?
  6. TS 中 any 和 unknown 的区别
  7. Things_androidThings入门
  8. H5是什么?个人浅薄说明
  9. 如何关闭iOS系统自动更新提示?
  10. 现代密码学 | 02:流密码——1