7-Stream收集器

收集器简介

将流中的元素累积成一个结果
作用于终端操作collect()上
collect/Collector/Collectors

收集器演示

将流元素归约和汇总成一个值
将流元素分组
将流元素分区

import com.alibaba.fastjson.JSON;
import org.junit.Before;
import org.junit.Test;

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

/**
 * @description: 常见预定义收集器使用
 */
public class StreamCollector {
    private static class Student{
        private String name;
        private Integer age;
        public String grade;

        Student(String name, Integer age, String grade){
            this.name = name;
            this.age = age;
            this.grade = grade;
        }

        public String getGrade() {
            return grade;
        }

        public void setGrade(String grade) {
            this.grade = grade;
        }

        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;
        }
    }

    List<Student> list;

    @Before
    public void init(){
        /**
         * 该写法有内存泄漏风险,不要在生产使用
         */
        list = new ArrayList<Student>(){
            {
                add(new Student("小明", 22, "二年级"));
                add(new Student("小黄", 20, "一年级"));
                add(new Student("小红", 21, "二年级"));
                add(new Student("小超", 25, "三年级"));
                add(new Student("小王", 20, "一年级"));
            }
        };
    }

    /**
     * 结果集输出为list
     */
    @Test
    public void toList(){
        List<Student> result = list.stream()
                .filter(student -> student.getAge() > 20)
                .collect(Collectors.toList());

        System.out.println(JSON.toJSONString(result, true));
        //[
        //    {
        //        "age":22,
        //        "grade":"二年级",
        //        "name":"小明"
        //    },
        //    {
        //        "age":21,
        //        "grade":"二年级",
        //        "name":"小红"
        //    },
        //    {
        //        "age":25,
        //        "grade":"三年级",
        //        "name":"小超"
        //    }
        //]
    }

    /**
     * 分组
     */
    @Test
    public void group(){
        Map<String, List<Student>> result = list.stream()
                .collect(Collectors.groupingBy(student -> student.getGrade()));
        System.out.println(JSON.toJSONString(result, true));
        //{
        //    "一年级":[
        //        {
        //            "age":20,
        //            "grade":"一年级",
        //            "name":"小黄"
        //        },
        //        {
        //            "age":20,
        //            "grade":"一年级",
        //            "name":"小王"
        //        }
        //    ],
        //    "三年级":[
        //        {
        //            "age":25,
        //            "grade":"三年级",
        //            "name":"小超"
        //        }
        //    ],
        //    "二年级":[
        //        {
        //            "age":22,
        //            "grade":"二年级",
        //            "name":"小明"
        //        },
        //        {
        //            "age":21,
        //            "grade":"二年级",
        //            "name":"小红"
        //        }
        //    ]
        //}
    }

    /**
     * 分区
     */
    @Test
    public void partition(){
        Map<Boolean, List<Student>> result = list.stream()
                .collect(Collectors.partitioningBy(student -> student.getAge() > 20));
        System.out.println(JSON.toJSONString(result, true));
        //{false:[
        //        {
        //            "age":20,
        //            "grade":"一年级",
        //            "name":"小黄"
        //        },
        //        {
        //            "age":20,
        //            "grade":"一年级",
        //            "name":"小王"
        //        }
        //    ],true:[
        //        {
        //            "age":22,
        //            "grade":"二年级",
        //            "name":"小明"
        //        },
        //        {
        //            "age":21,
        //            "grade":"二年级",
        //            "name":"小红"
        //        },
        //        {
        //            "age":25,
        //            "grade":"三年级",
        //            "name":"小超"
        //        }
        //    ]
        //}
    }
}

 

posted @ 2020-06-11 16:18  mingmingn  阅读(163)  评论(0)    收藏  举报