使用stream流简化对集合的操作

  • Post author:
  • Post category:其他

使用stream流筛选集合中的数据

使用传统的方式来筛选集合中的元素,我们可以想象到的方式就是遍历集合,将符合条件的元素存入一个新的集合中,或者将不符合的元素从集合中剔除。可是如果一旦筛选条件不止一个的时候,就会发现这种处理方式很繁琐,所以这个时候可以考虑使用jdk8的新特性,流式操作,再配合上lambda表达式和函数引用来简化代码的书写

常用方法

  • 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持链式调用
  1. forEach 逐一处理
  2. count 统计流中元素个数
  3. collect 将流转换为单列集合
  4. toArray 将流转换为数组
  • 延迟方法:返回值类型仍然是Stream接口自身类型的方法
  1. filter 过滤筛选
  2. limit 只取流中的前几个
  3. skip 跳过流中的前几个
  4. concat 合并两个流
  5. map 改变流中数据的数据类型
  • 注意:一个流的操作一定要有终结方法,可以没有非终结方法;创建一个流,只能使用一次,对流中的数据进行操作不会影响原来集合中的元素

具体的演示案例

/**
* 这是往集合中存储的对象类
*/
public class Student {
    /**
     * 主键
     */
    private Integer id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 性别
     */
    private String gender;

    public Student() {
    }

    public Student(Integer id, String name, Integer age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

public void test(){
        // 创建一个集合,存放对象元素
        List<Student> studentList = new ArrayList<>();
        // 创建Student对象
        Student stu1 = new Student(1,"zs",18,"男");
        Student stu2 = new Student(2,"ls",21,"男");
        Student stu3 = new Student(3,"ww",25,"男");
        Student stu4 = new Student(4,"xh",18,"女");
        Student stu5 = new Student(5,"xl",20,"女");
        Student stu6 = new Student(6,"zl",16,"男");
        Student stu7 = new Student(7,"lh",22,"男");
        Student stu8 = new Student(8,"yf",18,"女");
        Student stu9 = new Student(9,"yg",30,"男");
        Student stu10 = new Student(10,"lls",14,"男");
        // 往集合中添加数据
        studentList.add(stu1);
        studentList.add(stu2);
        studentList.add(stu3);
        studentList.add(stu4);
        studentList.add(stu5);
        studentList.add(stu6);
        studentList.add(stu7);
        studentList.add(stu8);
        studentList.add(stu9);
        studentList.add(stu10);

        // 去集合中的钱8个数据,并且要求把年龄大于20岁的男性的id存储到一个新的集合中
        // 获取流
        Stream<Student> stream = studentList.stream();
        //          lambda表达式筛选出取前8个             年龄大于20岁
        List<Integer> idList = stream.limit(8).filter(stu -> stu.getAge() > 20)
                // lambda表达式筛选出男性
                .filter(stu -> "男".equals(stu.getGender()))
                // 使用方法引用获取id
                .map(Student::getId).collect(Collectors.toList());

        System.out.println(idList);
    }

使用流配合上lambda表达式以及函数引用,可以极大的简化代码,并且提高处理速度


版权声明:本文为zhizong123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。