java 8 stream 的学习

本文详细介绍了Java Stream的各种操作,包括过滤、映射、分组、排序、统计等,通过实例展示了如何使用Stream处理集合数据,如提取姓名、筛选条件、排序和分组等。此外,还涉及到了集合转换,如List转Set和Map的操作。
摘要由CSDN通过智能技术生成

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);
       });
    
  • 输出结果
    在这里插入图片描述
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值