java Stream流的筛选、排序

java Stream流的筛选、排序

package lambda_stream;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Student {
          
   
    public int id;

    public String name;

    public double score;

    public int getId() {
          
   
        return id;
    }

    public void setId(int id) {
          
   
        this.id = id;
    }

    public Student() {
          
   
        // 重载了构造方法,默认的构造方法就失效了,如果要用默认的构造方法,就要再次进行说明
    }

    public String getName() {
          
   
        return name;
    }

    public void setName(String name) {
          
   
        this.name = name;
    }

    public double getScore() {
          
   
        return score;
    }

    public void setScore(double score) {
          
   
        this.score = score;
    }

    public Student(int id, String name, double score) {
          
   
        this.id = id;
        this.name = name;
        this.score = score;
    }

}

/**
 * 流的处理:
 * 流的创建(通过已有集合studentList.stream()、Stream.of())
 * 中间操作(filter(筛选,过滤)、map(映射)、sorted(排序)、limit(返回前n个)、skip(去掉前n个)、distinct(去重))得到的结果还是一个stream
 * 最终操作(count(统计流中个数)、forEach(迭代遍历)、collect(规约转换成集合))
 */
class Main {
          
   
    public static void main(String[] args) {
          
   
        List<Student> students = new ArrayList<>();
        students.add(new Student(1, "zhangsan", 100));
        students.add(new Student(5, "cuiting", 80));
        students.add(new Student(2, "lisi", 80));
        students.add(new Student(3, "wangwu", 60));
        students.add(new Student(4, "zhaoliu", 40));

        // 查找姓名为zhangsan的学生,打印分数
        List<Student> studentFilter = students.stream()
            .filter(student -> student.name.equals("zhangsan"))
            .collect(Collectors.toList());
        studentFilter.stream().forEach(student -> System.out.println("zhangsan的分数:" + student.score));
        // 统计学生分数80以上的人数
        System.out.println("分数80以上的人数:" + students.stream().filter(student -> student.score > 80).count());
        // 查找分数大于60的学生集合
        List<Student> studentsScoreOver60 = students.stream()
            .filter(student -> student.score > 60)
            .collect(Collectors.toList());
        studentsScoreOver60.stream().forEach(student -> System.out.println(student.name + "分数是:" + student.score));

        // 打印80即以上的2名同学的姓名和分数
        students.stream()
            .filter(student -> student.score >= 80)
            .limit(2)
            .forEach(student -> System.out.println(student.name + "的分数:" + student.score));

        // 根据分数升序排序,分数相同根据id升序排序:多字段排序
        List<Student> orderStudents = students.stream()
            .sorted(Comparator.comparing(Student::getScore).thenComparing(Student::getId))
            .collect(Collectors.toList());

        orderStudents.stream().forEach(student -> System.out.println(student.name+"排序的分数:"+student.score));

        // 分组统计不同分数的同学
        Map<Double,List<Student>> studentMap = students.stream().collect(Collectors.groupingBy(Student::getScore));
        for (List<Student> value : studentMap.values()){
          
   
            value.stream().forEach(student -> System.out.print(student.name+":"+student.score+" "));
            System.out.println();
        }
    }
}
经验分享 程序员 微信小程序 职场和发展