引言

在前面,写过java8实战系列文章,文章的内容都是基于《Java8 in Action》一书学习总结的。
这段时间在项目中很多地方都用到了,但很多时候都需要现查一下该怎么写,本篇博客就来总结一下关于List的一些常用的流操作。

基础代码

学生实体代码如下:
@Data
public class Student implements Serializable {/*** 编号*/private Integer id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 班级*/private String className;/*** 所在省*/private String province;/*** 学号*/private Integer stuNo;/*** 入学成绩*/private Double score;public Student(Integer id, String name, Integer age, String className, String province, Integer stuNo, Double score) {this.id = id;this.name = name;this.age = age;this.className = className;this.province = province;this.stuNo = stuNo;this.score = score;}
}
学生list代码如下:
private List<Student> buildStudentList() {return Arrays.asList(new Student(1, "张扬", 18, "A", "北京", 45, 83.2),new Student(2, "李丹", 22, "A", "天津", 15, 65.5),new Student(3, "张丹", 22, "B", "山东", 44, 78.4),new Student(4, "白天", 19, "B", "北京", 1, 63.7),new Student(5, "王武", 20, "C", "湖南", 34, 78.3));
}
下面将通过对学生list的操作来展示如何使用java8中的stream来对list进行转换、分组、过滤、求和、排序等操作。

流的使用

1. Collectors.joining:list转换为指定字符分隔的字符串

/*** list转字符串,指定逗号字符分隔*/
@Test
public void stuJoin() {List<Student> students = buildStudentList();//集合中的名字用逗号分隔String names = students.stream().map(Student::getName).collect(Collectors.joining(","));//结果:张扬,李丹,张丹,白天,王武System.out.println(names);
}

2. Collectors.toMap:list转换为map

/*** list转map* toMap 如果集合对象有重复的key,会报错Duplicate key ....* word1,word2的id都为1。* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2*/
@Test
public void stuMap() {List<Student> students = buildStudentList();Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getId, s -> s, (s1, s2) -> s1));//结果:{1=Student(id=1, name=张扬, age=18, className=A, province=北京, stuNo=45, score=83.2), 2=Student(id=2, name=李丹, age=22, className=A, province=天津, stuNo=15, score=65.5), 3=Student(id=3, name=张丹, age=22, className=B, province=山东, stuNo=44, score=78.4), 4=Student(id=4, name=白天, age=19, className=B, province=北京, stuNo=1, score=63.7), 5=Student(id=5, name=王武, age=20, className=C, province=湖南, stuNo=34, score=78.3)}System.out.println(studentMap);
}

3. Collectors.groupingBy:分组

/*** 按对象指定属性分组*/
@Test
public void stuGroup() {List<Student> students = buildStudentList();//按照班级进行分组Map<String, List<Student>> classMap = students.stream().collect(Collectors.groupingBy(Student::getClassName));//结果:{A=[Student(id=1, name=张扬, age=18, className=A, province=北京, stuNo=45, score=83.2), Student(id=2, name=李丹, age=22, className=A, province=天津, stuNo=15, score=65.5)], B=[Student(id=3, name=张丹, age=22, className=B, province=山东, stuNo=44, score=78.4), Student(id=4, name=白天, age=19, className=B, province=北京, stuNo=1, score=63.7)], C=[Student(id=5, name=王武, age=20, className=C, province=湖南, stuNo=34, score=78.3)]}System.out.println(classMap);
}

4. filter:过滤

/*** 过滤出某个值的集合*/
@Test
public void stuFilter() {List<Student> students = buildStudentList();//筛选出省份为北京的学生List<Student> list = students.stream().filter(s -> s.getProvince().equals("北京")).collect(Collectors.toList());//结果:[Student(id=1, name=张扬, age=18, className=A, province=北京, stuNo=45, score=83.2), Student(id=4, name=白天, age=19, className=B, province=北京, stuNo=1, score=63.7)]System.out.println(list);
}

5. Collectors.summarizingDouble:统计

/*** 分组后统计数据(集合个数、分数求和、最小值、平均值、最大值)*/
@Test
public void stuStatistics() {List<Student> students = buildStudentList();//按照班级进行分组Map<String, DoubleSummaryStatistics> classMap = students.stream().collect(Collectors.groupingBy(Student::getClassName, Collectors.summarizingDouble(Student::getScore)));//结果:{A=DoubleSummaryStatistics{count=2, sum=148.700000, min=65.500000, average=74.350000, max=83.200000}, B=DoubleSummaryStatistics{count=2, sum=142.100000, min=63.700000, average=71.050000, max=78.400000}, C=DoubleSummaryStatistics{count=1, sum=78.300000, min=78.300000, average=78.300000, max=78.300000}}System.out.println(classMap);//分组后指定集合的总和:148.7System.out.println(classMap.get("A").getSum());//分组后指定集合的最大值:78.4System.out.println(classMap.get("B").getMax());//分组后指定集合的最小值:65.5System.out.println(classMap.get("A").getMin());//分组后指定集合的平均值:74.35System.out.println(classMap.get("A").getAverage());//分组后指定集合的个数:1System.out.println(classMap.get("C").getCount());
}

6. Collectors.toCollection:set去重

/*** 去重*/
@Test
public void stuSet() {List<Student> students = buildStudentList();ArrayList<Student> list = students.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getProvince))), ArrayList::new));//结果:[Student(id=1, name=张扬, age=18, className=A, province=北京, stuNo=45, score=83.2), Student(id=2, name=李丹, age=22, className=A, province=天津, stuNo=15, score=65.5), Student(id=3, name=张丹, age=22, className=B, province=山东, stuNo=44, score=78.4), Student(id=5, name=王武, age=20, className=C, province=湖南, stuNo=34, score=78.3)]System.out.println(list);
}

7. max和min:最大值和最小值

/*** 最大值和最小值*/
@Test
public void stuMaxMin() {List<Student> students = buildStudentList();//结果:Student(id=2, name=李丹, age=22, className=A, province=天津, stuNo=15, score=65.5)students.stream().max(Comparator.comparing(Student::getAge)).ifPresent(System.out::println);//结果:Student(id=1, name=张扬, age=18, className=A, province=北京, stuNo=45, score=83.2)students.stream().min(Comparator.comparing(Student::getAge)).ifPresent(System.out::println);
}

8. sorted:排序

/*** 排序*/
@Test
public void stuSort() {List<Student> students = buildStudentList();//筛选B班的学生,并按年龄从小到大排序List<Student> list = students.stream().filter(s -> "B".equals(s.getClassName())).sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());//结果:[Student(id=4, name=白天, age=19, className=B, province=北京, stuNo=1, score=63.7), Student(id=3, name=张丹, age=22, className=B, province=山东, stuNo=44, score=78.4)]System.out.println(list);//筛选B班的学生,并分数从高到低List<Student> listReverse = students.stream().filter(s -> "B".equals(s.getClassName())).sorted(Comparator.comparing(Student::getScore).reversed()).collect(Collectors.toList());//结果:[Student(id=3, name=张丹, age=22, className=B, province=山东, stuNo=44, score=78.4), Student(id=4, name=白天, age=19, className=B, province=北京, stuNo=1, score=63.7)]System.out.println(listReverse);
}

总结

下面是流的常用方法总结,可根据实际场景选择使用:

在实际项目中,真正体会到有时候复杂的需求,直接用流操作,能很容易实现,并且代码上简化了很多。
PS:又是一年1024,程序员(媛)们节日快乐!

【Java8实战】list分组、过滤、统计、排序等常用操作相关推荐

  1. MongoDB实战系列之二:MongoDB的常用操作

    #以服务方式启动mongodb,要求验证 /elain/apps/mongodb/bin/mongod --fork --port 27001 --auth --dbpath /elain/data/ ...

  2. java steam 排序_java8 stream自定义分组求和并排序的实现

    本文主要介绍了java8 stream自定义分组求和并排序的实现,分享给大家,具体如下: public static void main(String[] args) { List list = ne ...

  3. Scala进阶_函数式编程(过滤丶排序丶分组丶聚合)

    过滤 | filter 过滤符合一定条件的元素 定义 方法签名 def filter(p: (A) ⇒ Boolean): TraversableOnce[A] 方法解析 filter方法 API 说 ...

  4. spring-mongoDB mongoTemplate排序分组|分页|统计

    包含一些mongo的常用操作:统计求和,常规排序,分页,查询子文档,查询子文档的数组,排序后分组,按条件删除等 统计求和转换字符串为double db.getCollection('receipt_i ...

  5. Kesci的十套数据分析练习笔记练习1-开始了解你的数据练习2-数据过滤与排序练习3-数据分组练习4-Apply函数练习5-合并练习6-统计练习7-可视化练习8-创建数据框练习9-时间序列练习10-删

    练习题Kesci链接: [ link ](https://www.kesci.com/home/project/59e77a636d213335f38daec2) 文章目录 练习1-开始了解你的数据 ...

  6. java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)(1)

    return new CollectorImpl<CharSequence, StringBuilder, String>( StringBuilder::new, StringBuild ...

  7. 转贴:girdview分组,统计,排序的解决方案

    转自:http://hi.baidu.com/sneer_owen/blog/item/ec85e0df164d4651cdbf1a02.html 导言:        GridView 控件与 Da ...

  8. java8实战怎么样_Java8中你可能不知道的一些地方之Stream实战

    说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...

  9. 《Java8实战》读书笔记06:Parallel Stream 并行流

    <Java8实战>读书笔记06:Parallel Stream 并行流 第7章 并行数据处理与性能 7.1 并行流 7.1.1 将顺序流转换为并行流 7.1.2 测量流性能 7.1.3 正 ...

  10. Java8实战学习笔记(三)——函数式数据处理

    一.引入流 (一).引言 1.流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).可以看成遍历数据集的高级迭代器. 流可以透明地并行 ...

最新文章

  1. Google和Yahoo专家联手揭秘世界顶尖公司的技术内幕
  2. Linux运维系统工程师系列---16
  3. python小项目实例流程-python实现的简单RPG游戏流程实例
  4. Maximum Subsequence Value CodeForces - 1365E(规律+暴力)
  5. SAP编程中最基本的概念
  6. BGP——选路—(8~13条)选路源分析(讲解+配置命令)
  7. 字符验证码识别项目记录
  8. 浅谈消息队列的原理及优势
  9. x390拆机_用了七八年的笔记本电脑依然流畅如初,从X230i换到X390
  10. ArcSegment对象
  11. 算法眼中的世界是什么样子?他们用一些彩色方块画了出来
  12. 关于添加文件删除权限
  13. php yyuc框架,如何学习YYUC框架
  14. 水位传感器工作原理及应用
  15. PHP生成腾讯云API签名
  16. 电脑出现蓝屏后自动重启是什么原因
  17. excel自动换行_你会用Excel制作 流程图 吗?
  18. 魅族 刷机android 6.0,乐视X900+安卓6.0 魅族Flyme6刷机包 最新6.7.12.29R付费纯净版
  19. oracle 12c导入dmp文件(实践)
  20. 成长有方法:爆发式成长的25个思维模型

热门文章

  1. 实验-网络攻击(字典攻击)
  2. VB获取窗体的位置和大小
  3. JixiPix Snow Daze for Mac(下雪效果制作软件)
  4. vba模拟鼠标点击_网页自动输入录入用阿冲全能点击王轻松完成
  5. B key-M key-BM key
  6. 使用Windows自带工具校验文件MD5
  7. linux命令详解词典pdf,[计算机]linux命令详解词典
  8. CMM3 正式评估全过程
  9. 1、NoSQL数据库简介
  10. SQL server 2017安装教程