java8 拆分list_Java 8 stream 流 拆分list
背景:希望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相关推荐
- java拆分list_Java 8 stream 流 拆分list
背景:希望List 可以根据某个字段 进行分组 然后拆分 使用Java 8 的流来做. java.util.stream.Collectors#groupingBy(java.util.functi ...
- 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...
- java stream byte_乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- Java8新特性之Stream流式编程
特地感谢鲁班大叔的分享,原学习地址:Java8 Stream流式编程爱 撸码就是快,流式编程好 代码传家宝 以下是学习过程整理的笔记 1.简介 Stream 流处理,首先要澄清的是 java8 中的 ...
- java8新特性之Stream流
一.什么是Stream流 Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤.映射数据等操作,使用Stream API对集合数据进行操作就 ...
- Java8新特性-使用Stream流来实现递归遍历树形结构(案例)
Java8新特性-Stream流 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来 ...
- Java8函数式编程、Stream流、Option的使用,一篇足够了
为什么要学 大数量下处理集合效率高 代码可读性高 消灭嵌套地狱 // 查询未成年作家的评分在70以上的书籍 List<Book> bookList = new ArrayList<& ...
- Java8 方法引用和Stream流
Stream 流API 什么是流 流的操作种类 流的操作过程 使用流 创建流 集合 数组 值 筛选 filter 去重 distinct 截取 limit 跳过 skip 映射 map 合并多个流 是 ...
- java8函数式编程之Stream流处理的方法和案例讲解
函数式编程最早是数学家阿隆佐·邱奇研究的一套函数变换逻辑,又称Lambda Calculus(λ-Calculus),所以也经常把函数式编程称为Lambda计算. 为什么Java需要Lambda表达式 ...
最新文章
- XP局域网访问无权限、不能互相访问问题的完整解决方案
- 反射型XSS漏洞的条件+类型+危害+解决
- mysql简单分表_mysql分区分表哪个好
- php sqlite id自增,Android sqlite设置主键自增长的方法教程
- 博弈论 斯坦福game theory stanford week 3.2_
- 【Java】Socket多客户端Client-Server聊天程序
- 上海交大MBA学费与资助
- linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)
- 这个星期压力貌似比较大啊!
- iqooneo系统要不要更新_手机系统要不要升级?别纠结,1分钟看完你就知道
- android 100以内的随机数
- 远程桌面与本计算机共享文件,win7系统开启远程桌面共享文件的方法
- matlab中划分训练集和测试集
- 小米平板2刷哪个系统更流畅_两个系统随你选 小米平板2刷机小教程
- 计算机提示没有有效的ip配置,教大家电脑提示以太网没有有效的ip配置怎么办...
- /usr/bin/ld cannot find -lGL
- 大都会人寿线下培训第三天回顾
- Linux use apktool problem
- 企业公众号做内容输出有哪些要点
- 一文理解Flink 水位线(Flink Watermark)