1. 如何创建Stream

//new一个集合
List<String> list = new ArrayList<>();
//普通流
Stream<String> stream = list.stream();
//并行流 需要注意线程安全问题
Stream<String> stringStream = list.parallelStream();

2. Stream常用的中间操作

2.1 Map 元素类型转换

//生成一个包含学生的集合
List<Student> list = new ArrayList<>();
//获取学生的姓名集合
List<String> nameList = list.stream().map(Student::getName).collect(Collectors.toList());
//获取学生的Id集合
List<String> idList = list.stream().map(Student::getId).collect(Collectors.toList());

2.2 Filter 过滤

//获取姓名是ww的集合
List<Student> collect = list.stream().filter(student -> "ww".equals(student.getName())).collect(Collectors.toList());

2.3 Sort  排序

//按照学生的年龄升序排列
List<Student> sortedUpStudent = list.stream().sorted(Comparator.comparingInt(Student::getAge)).collect(Collectors.toList());
//按照学生的年龄降序排列
List<Student> sortedDowmStudent = list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).collect(Collectors.toList());

3. 常用操作

3.1 给list去重

//根据学生的name属性去重
List<Student> hostList=list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(Student :: getName))),ArrayList::new));

3.2 Collectors相关实例

      // 累积名字属性到一个集合中List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());// 累积名字属性到一个TreeSet中Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));// 将元素转为String,并串联他们,中间的分隔符是逗号String joined = things.stream().map(Object::toString).collect(Collectors.joining(", "));// 见员工的工资求和int total = employees.stream().collect(Collectors.summingInt(Employee::getSalary)));// 将员工按部门分组Map<Department, List<Employee>> byDept= employees.stream().collect(Collectors.groupingBy(Employee::getDepartment));// 求出各部门的薪资总和Map<Department, Integer> totalByDept= employees.stream().collect(Collectors.groupingBy(Employee::getDepartment,Collectors.summingInt(Employee::getSalary)));// 按照分数及格与否对学生分区Map<Boolean, List<Student>> passingFailing =students.stream().collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

4. 练习实例

// 测试数据List<Student> list = new ArrayList<>();list.add(new Student("李明", "男", 10D));list.add(new Student("李飞", "男", 20d));list.add(new Student("张丽", "女", 30d));list.add(new Student("张艳", "女", 40d));list.add(new Student("王朋", "男", 50d));list.add(new Student("陈晴", "女", 60d));list.add(new Student("王菲", "女", 70d));list.add(new Student("李雷", "男", 80d));list.add(new Student("张三", "中性", 80d));list.add(new Student("李四", "中性", 80d));要求返回格式为: (根据性别分组,且金额累加)
[{value: 1048, name: '中性'},{value: 735, name: '男'},{value: 735, name: '女'}]

解决方法:

List<HashMap<String, Object>> collect =
// 流stream化
list.stream()
// 开始对性别分组和金额求和
.collect(Collectors.groupingBy(Student::getGender,Collectors.summingDouble(Student::getMoney)))
// 上面得到的是一个Map<String,Double>,所以需要进一步转化
.entrySet()
// 流stream化
.stream()
// 执行中间操作map,把map转化成List<Map>
.map(entry -> {HashMap<String, Object> hashMap = new HashMap<>();hashMap.put("name", entry.getValue());hashMap.put("value", entry.getKey());return hashMap;
})
// 操作结束,返回List<Map>
.collect(Collectors.toList());

Java 8 Stream Lambda 的学习与使用相关推荐

  1. java jdk8 Stream流操作学习

    Stream流有一些特性: Stream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作. 这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作. Stream ...

  2. java中的lambda表达式学习

    Lambda表达式是给函数式接口(SAM接口)的变量或形参赋值的表达式. Lambda表达式替代了原来使用匿名内部类的对象给函数式接口(SAM接口)的变量或形参赋值的形式. java提供了大量的函数式 ...

  3. Stream 流 【学习笔记】Java 基础

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...

  4. comparator接口_8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

    我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  5. Java 8 stream学习

    简介 Java 8里引入的另外一个重要特性就是stream api.笼统的来说,它这种特性的引入可以方便我们以一种更加声明式的方式来写代码,更加便利了一些函数式编程方法的使用.同时,它也使得我们可以充 ...

  6. Java 8 Stream API学习记录

    Stream简介 1.Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. 2.stream是对集合对象功能的 ...

  7. Java 8 - Stream流骚操作解读

    文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...

  8. Java Streams,第 1 部分: java.util.stream 库简介

    Java SE 8 中主要的新语言特性是拉姆达表达式.可以将拉姆达表达式想作一种匿名方法:像方法一样,拉姆达 表达式具有带类型的参数.主体和返回类型.但真正的亮点不是拉姆达表达式本身,而是它们所实现的 ...

  9. java编程学习方法_在线学习Java编程的最佳方法

    java编程学习方法 1.简介 Java是使用最广泛的编程语言之一. 根据Github的最新报告 ,Java被列为仅次于JavaScript的第二大最常用的编程语言. 掌握Java的人有很多话题. 好 ...

最新文章

  1. excel如何匹配同名数据_Excel如何查找名字重复的数据
  2. Python绘制简单函数曲线(包括坐标范围限制、刻度指定)
  3. python mro c3_python的MRO和C3算法
  4. Linux编程练习 --多线程2--属性的设置
  5. 选择CA厂商的加密证书
  6. 前端改变div排序_前端面试经常问到的问题
  7. arduino循迹小车
  8. Android-蓝牙AVRCP功能实现【转】
  9. 基于格密码的算法研究
  10. 御用导航提示提醒_AR实景导航,让你安全驾驶,不再“绕弯”
  11. 网易有道词典识别不了adobe打开的pdf
  12. 使用Fiddler修改百度的Logo
  13. 什么是jsp,什么是Servlet?jsp和Servlet有什么区别?
  14. C语言零基础入门级数据类型+运算符+控制流+ASCII 码表+面试题【系统学习第二天】
  15. centos上启动mysql_centos下怎么启动mysql
  16. html图片百叶窗轮播,纯js百叶窗效果轮播图插件
  17. JAVA程序填空题用公式求e_Java 使用对象 编程练习题
  18. 网技·实验·3.29
  19. 2022-2028年全球及中国斯特林发动机行业投资前景分析
  20. 美团CodeM2018资格赛赛题官方版本详解(二)——可乐

热门文章

  1. chrome 常用插件下载安装
  2. 52函数零点或方程根的个数讨论
  3. 解决Linux 负载过高问题过程记录
  4. JS获取当前时间的前几天、前几周、前几个月、前几年的时间
  5. MIT oracle ma 信号线,美国 MIT Oracle MA-X Phono唱臂线 独家Multipole技术
  6. 认真分享一波本科 4 年挣到人生第一个 30w 的经历:目标->动力->坚持->改变
  7. Linux 内核 notifier机制
  8. Cauchy distribution
  9. 对比性句子sentiment analysis
  10. 谷歌、甲骨文史诗级版权诉讼案,10 年 API 之争本周开审