文章目录

  • stream 学习
    • 1. 准备一个Student实体,然后搞点人如下
    • 2. stream 的详细应用
      • 2.1、 取出所有学生姓名,转为一个list
      • 2.2、 取出所有年龄大于17的学生姓名,转为一个list
      • 2.3、 取出所有大于18的学生对象,转为一个list
      • 2.4、 获取姓王 的学生信息
      • 2.5、 取出所有不重复的学生分数列表 distinct()
      • 2.6、 所有学生中是否所有人分数都在250分以上(全匹配)
      • 2.7、所有学生中是否存在年龄大于20岁的(任意匹配) anyMatch()
      • 2.8、所有学生中是否所有年龄都不大于20岁(都不匹配)noneMatch()
      • 2.9、按照学生年龄排序(默认升序) sorted()
      • 2.10、按照学生年龄降序排序(只要加上.reversed()即可)
      • 2.11、多条件排序:根据学生年龄降序排序后并按照分数升序排序
      • 2.12、根据学生总分数降序,并获取第2页数据,每页3条数据(初始页为1)
      • 2.13、根据班级分组
      • 2.14、先根据班级分组,然后组内再根据分数降序排序
      • 2.15、多条件分组(根据班级分组后再对班级内男女生进行分组)
      • 2.16、分别求学生分数中的最小值,最大值,所有总分和,平均值
      • 2.17、使用统计收集器分别求学生分数中的最小值,最大值,所有总分和,平均值
      • 2.18、字符串拼接
      • 2.19、集合转换:list转set
      • 2.20、集合转换:list 转map(姓名->学生信息)

stream 学习

  • 经常在写代码的时候总是有时候忘了stream流怎么转换了,今天有时间练习一下;

1. 准备一个Student实体,然后搞点人如下

  • Student 实体
@Data
@AllArgsConstructor
public class Student {private String classNo;private String name;private String enName;private Integer age;private String sex;private Integer totalScore;
}
  • Student 集合
     Student a = new Student("1班", "张三", "zs", 18, "男", 299);Student b = new Student("1班", "王小明", "xm", 17, "男", 278);Student c = new Student("3班", "周大红", "", 18, "女", 255);Student d = new Student("1班", "刘老六", "lll", 19, "男", 300);Student e = new Student("2班", "李小华", "", 18, "女", 281);Student f = new Student("4班", "陈花花", "", 17, "女", 281);Student g = new Student("2班", "王老五", "wlw", 20, "男", 229);Student h = new Student("3班", "李四", "ls", 16, "男", 267);Student i = new Student("2班", "林大庄", "", 17, "男", 297);List<Student> list = Arrays.asList(a, b, c, d, e, f, g, h, i);

2. stream 的详细应用

  • 先了解一下流的一个基本操作流程,如下图

2.1、 取出所有学生姓名,转为一个list

  • 上代码

           List<String> collect = list.stream().map(stu -> (stu.getName())).collect(Collectors.toList());collect.forEach(x->{System.out.print(x +",");});
    
  • 输出结果
  • 还有一种写法
     List<String> collect2 = list.stream().map(Student::getName).collect(Collectors.toList());collect2.forEach(System.out::println);
    
  • 输出结果

2.2、 取出所有年龄大于17的学生姓名,转为一个list

  • 上代码

           List<String> collect3 = list.stream().filter(stu -> stu.getAge() > 17).map(stu -> stu.getName()).collect(Collectors.toList());for (String str: collect3) {System.out.println("年龄大于17的学生姓名:"+ str);}
    
  • 输出结果

2.3、 取出所有大于18的学生对象,转为一个list

  • 上代码

         List<Student> collectAge = list.stream().filter(student -> student.getAge() > 18).collect(Collectors.toList());collectAge.forEach(System.out::println);
    
  • 输出结果

2.4、 获取姓王 的学生信息

  • 上代码

       List<Student> collectNames = list.stream().filter(student -> student.getName().startsWith("王")).collect(Collectors.toList());collectNames.forEach(System.out::println);
    
  • 输出结果

2.5、 取出所有不重复的学生分数列表 distinct()

  • 上代码

        List<Integer> collectTotalScores = list.stream().map(Student::getTotalScore).distinct().collect(Collectors.toList());collectTotalScores.forEach(System.out::println);
    
  • 输出结果

2.6、 所有学生中是否所有人分数都在250分以上(全匹配)

  • 上代码

        List<Integer> collectTotalScores = list.stream().map(Student::getTotalScore).distinct().collect(Collectors.toList());collectTotalScores.forEach(System.out::println);
    
  • 输出结果

2.7、所有学生中是否存在年龄大于20岁的(任意匹配) anyMatch()

  • 上代码

         boolean b2 = list.stream().map(Student::getAge).anyMatch(n -> n > 20);System.out.println("所有学生中是否存在年龄大于20岁的:"+ b2);
    
  • 输出结果

2.8、所有学生中是否所有年龄都不大于20岁(都不匹配)noneMatch()

  • 上代码

       boolean b3 = list.stream().map(Student::getAge).noneMatch(n -> n > 20);System.out.println("所有学生中是否所有年龄都不大于20岁:"+ b3);
    
  • 输出结果

2.9、按照学生年龄排序(默认升序) sorted()

  • 上代码

        List<Student> studentList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());studentList.forEach(System.out::println);
    
  • 输出结果

2.10、按照学生年龄降序排序(只要加上.reversed()即可)

  • 上代码

         List<Student> studentList1 = list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());studentList1.forEach(System.out::println);
    
  • 输出结果

2.11、多条件排序:根据学生年龄降序排序后并按照分数升序排序

  • 上代码

       List<Student> collectAgeSorts = list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getTotalScore)).collect(Collectors.toList());collectAgeSorts.forEach(System.out::println);
    
  • 输出结果

2.12、根据学生总分数降序,并获取第2页数据,每页3条数据(初始页为1)

  • 上代码

       List<Student> collectAgeSorts = list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getTotalScore)).collect(Collectors.toList());collectAgeSorts.forEach(System.out::println);
    
  • 输出结果

2.13、根据班级分组

  • 上代码

       Map<String, List<Student>> classStus = list.stream().collect(Collectors.groupingBy(Student::getClassNo));classStus.forEach((k,v)->{System.out.println("k:"+k+",v:"+v.size() +"个人");});
    
  • 输出结果

2.14、先根据班级分组,然后组内再根据分数降序排序

  • 上代码

       Map<String, List<Student>> classSores = list.stream().sorted(Comparator.comparingInt(Student::getTotalScore).reversed()).collect(Collectors.groupingBy(Student::getClassNo));classSores.forEach((k,v)->{System.out.println("k:"+k+",v:"+v.toString());});
    
  • 输出结果

2.15、多条件分组(根据班级分组后再对班级内男女生进行分组)

  • 上代码

        Map<String, Map<String, List<Student>>> map = list.stream().collect(Collectors.groupingBy(Student::getClassNo, Collectors.groupingBy(Student::getSex)));map.forEach((k,v)->{System.out.println("k:"+k+",v:"+v.toString());});
    
  • 输出结果

2.16、分别求学生分数中的最小值,最大值,所有总分和,平均值

  • 上代码

       int min = list.stream().mapToInt(Student::getTotalScore).min().getAsInt();//最大值int max = list.stream().mapToInt(Student::getTotalScore).max().getAsInt();//总分数int sum = list.stream().mapToInt(Student::getTotalScore).sum();//计量long count = list.stream().mapToInt(Student::getTotalScore).count();//平均值double average = list.stream().mapToInt(Student::getTotalScore).average().getAsDouble();//平均值更保险方式:增加orElse() 默认值,防止列表为空double average1 = list.stream().mapToInt(Student::getTotalScore).average().orElse(0.0);System.out.println("max: " + max);System.out.println("min: " + min);System.out.println("sum: " + sum);System.out.println("count: " + count);System.out.println("average: " + average);System.out.println("average1: " + average1);
    
  • 输出结果

2.17、使用统计收集器分别求学生分数中的最小值,最大值,所有总分和,平均值

  • 上代码

        System.out.println("----------------------使用统计收集器-----------------------------");IntSummaryStatistics statistics = list.stream().mapToInt(Student::getTotalScore).summaryStatistics();System.out.println("max: " + statistics.getMax());System.out.println("min: " + statistics.getMin());System.out.println("sum: " + statistics.getSum());System.out.println("count: " + statistics.getCount());System.out.println("average: " + statistics.getAverage());
    
  • 输出结果

2.18、字符串拼接

  • 上代码

        System.out.println("----------------------使用统计收集器-----------------------------");IntSummaryStatistics statistics = list.stream().mapToInt(Student::getTotalScore).summaryStatistics();System.out.println("max: " + statistics.getMax());System.out.println("min: " + statistics.getMin());System.out.println("sum: " + statistics.getSum());System.out.println("count: " + statistics.getCount());System.out.println("average: " + statistics.getAverage());
    
  • 输出结果

2.19、集合转换:list转set

  • 上代码

       System.out.println("----------------------list转set-----------------------------");Set<String> classNo = list.stream().map(Student::getClassNo).collect(Collectors.toSet());classNo.forEach(System.out::println);
    
  • 输出结果

2.20、集合转换:list 转map(姓名->学生信息)

  • 上代码

       Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(Student::getName, u -> u));studentMap.forEach((k,v)->{System.out.println("k:"+k+",v:"+v);});
    
  • 输出结果

java 8 stream 的学习相关推荐

  1. Java 8 Stream API学习记录

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

  2. Java 8 Stream常用方法学习

    文章目录 Stream基础概念 1. 分类 2. 常用方法 2.1 forEach 2.2 filter 2.3 distinct 2.4 Collectors - (Collector工具库) 2. ...

  3. 学了java然后深入_JAVA8学习——从源码角度深入Stream流(学习过程)

    从源代码深入Stream / 学习的时候,官方文档是最重要的. 及其重要的内容我们不仅要知道stream用,要知道为什么这么用,还要知道底层是怎么去实现的. --个人注释:从此看出,虽然新的jdk版本 ...

  4. 【Stream流学习】Java 8 新特性|Collectors.joining() 案例详解

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  5. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  6. java jdk8 Stream流操作学习

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

  7. Java 8 stream学习

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

  8. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  9. Java 8 Stream Api 中的 skip 和 limit 操作

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 Java 8 Stream API 中的sk ...

最新文章

  1. Python学习笔记:I/O编程
  2. [iOS]iOS AudioSession详解 Category选择 听筒扬声器切换
  3. 你的 Docker 应用是安全的吗?
  4. java想要生成 字符串,如何在Java中“优雅地”生成String?
  5. IT = 加班多?外国小哥打破“魔咒”:“每天工作 10 分钟,工资近 9 万美元!”...
  6. 容器技术:华为云如何帮助企业落地Kubernetes
  7. centos6下yslow部署
  8. linux进程栈和线程栈大小,Linux进程栈和线程栈
  9. matlab2014a如何画电机效率云图,maxwell电机转矩扫描与使用MTPA策略绘制效率map图...
  10. 视觉SLAM总结-本质矩阵E分解
  11. matlab专区--------------matlab里面如何保留小数特定位数
  12. 闲聊机器人实例四:python实现小姜机器人,BERT检索模型,新增一个余弦相似度Cosine层, 解决BERT句向量编码传输耗时问题。部署tf-serving
  13. Element 根据勾选导出Excel表格数据
  14. FPGA三大串行通信接口之UART
  15. css 2713,CSS3 梅花花瓣
  16. MFC中CString转为char*;char*转为CString
  17. 架构三要素:职责明确的模块或者组件、关联关系、约束和指导原则
  18. 硬件知识-ADC模数转换芯片
  19. vue2 django前后端分离(一.环境搭建)
  20. NFC手机识别身份证的技术实现思路

热门文章

  1. 好好说话之ret2csu
  2. wifi(华硕天选2)找不到怎么办
  3. linux基因组文件,科学网-NGS基础 - 参考基因组和基因注释文件-陈同的博文
  4. 学习笔记—什么是微数据?itemscope/itemtype/itemprop(搜索引擎seo优化)
  5. python3中使用pip3错误syn_python-pip3错误-'_NamespacePath'对象没有属性'sort'
  6. 22-02-08数据库迁移sql问题
  7. PC与S7 1200PLC通讯
  8. Photoshop for Mac(图像处理软件)破解版安装
  9. Java 首字母大写高效方法
  10. (附代码)数独大作业【读取数独,解数独,生成唯一解数独(随机,特定形状,不同难度生成),玩数独】