【持续记录】java8流常用代码

对于java8中的stream,由于工作中不常使用,所以很容易忘记。但一旦有相应场景,使用起来很方便,在这里记录一下我使用过的常用流。
我对流操作的感受:流操作可以类比我们的sql语句,用流可以实现where、group by等。
实体类:

    class Person{
    
    
        private String name;
        private int age;
        private String province;
        private String city;
        
        public Person(String name, int age, String province, String city) {
    
    
            this.name = name;
            this.age = age;
            this.province = province;
            this.city = city;
        }

        public Person(String name, int age) {
    
    
            this.name = name;
            this.age = age;
        }

		// 节约博客空间,省略getter、setter、toString
    }

group by

    private void groupBy(){
    
    
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("张三",13,"吉林","长春");
        Person person2 = new Person("陈二",12,"吉林","四平");
        Person person3 = new Person("李四",14,"辽宁","沈阳");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        Map collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));
        System.out.println(collect);
    }

结果:

{吉林={四平=[Person{name='陈二', age=12, province='吉林', city='四平'}], 长春=[Person{name='张三', age=13, province='吉林', city='长春'}]}, 辽宁={沈阳=[Person{name='李四', age=14, province='辽宁', city='沈阳'}]}}

指定group by结果集,一个group by:

    private void groupBy(){
    
    
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("张三",13,"吉林","长春");
        Person person2 = new Person("张五",13,"吉林","长春");
        Person person3 = new Person("陈二",12,"吉林","四平");
        Person person4 = new Person("李四",14,"辽宁","沈阳");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        Map<String,List<Person>> collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince/*, Collectors.groupingBy(Person::getCity)*/));
        System.out.println(collect);
    }

指定group by结果集,两个group by:

    private void groupBy(){
    
    
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("张三",13,"吉林","长春");
        Person person2 = new Person("张五",13,"吉林","长春");
        Person person3 = new Person("陈二",12,"吉林","四平");
        Person person4 = new Person("李四",14,"辽宁","沈阳");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        Map<String,Map<String,List<Person>>> collect = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));
        System.out.println(collect);
    }

filter

使用stream().filter()来过滤一个List对象,查找符合条件的对象集合。
下面示例的等效SQL:age>13 AND province=‘吉林’

    private void filter(){
    
    
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("张三",12,"吉林","长春");
        Person person2 = new Person("陈二",14,"吉林","四平");
        Person person3 = new Person("陈五",15,"吉林","松原");
        Person person4 = new Person("李四",16,"辽宁","沈阳");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        List<Person> collect = personList.stream().filter(person -> person.getAge() > 13 && person.getProvince().equals("吉林")).collect(Collectors.toList());
        System.out.println(collect);
    }

结果:

[Person{name='陈二', age=14, province='吉林', city='四平'}, Person{name='陈五', age=15, province='吉林', city='松原'}]

sort

    public void sort(){
    
    
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("张三",13);
        Person person2 = new Person("陈二",9);
        Person person3 = new Person("李四",14);
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        // 按照年龄排序,默认升序
        List<Person> collect = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
        System.out.println(collect);
    }

NOT IN

需求:两个集合,一个大集合,一个小集合,集合的元素类是一个,要求从大集合中去掉小集合

    private void test(){
    
    
        Test test1 = new Test("1","Bob1",121);
        Test test2 = new Test("2","Bob2",122);
        Test test3 = new Test("3","Bob3",123);
        Test test4 = new Test("4","Bob4",124);
        Test test5 = new Test("5","Bob5",125);
        List<Test> all = new ArrayList<>();
        all.add(test1);
        all.add(test2);
        all.add(test3);
        all.add(test4);
        all.add(test5);
        List<Test> child = new ArrayList<>();
        child.add(test2);
        child.add(test3);
        all.removeIf(item->{
    
    
            return child.stream().anyMatch(childItem ->{
    
    
            	// 如果子集合的id和全集的id相同,就从全集内去掉该元素
                return childItem.getId().equals(item.getId());
            });
        });
        System.out.println(all);
    }


    class Test{
    
    
        private String id;
        private String name;
        private Integer age;
		// 省略了构造方法和getter setter
    }

猜你喜欢

转载自blog.csdn.net/JWbonze/article/details/115614057