java 8 stream 的使用案例,各种转换,详细版

155 阅读4分钟

@[toc]

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);
       });
    
  • 输出结果 在这里插入图片描述