文章目录
- 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); });
- 输出结果