Lambda中groupBy分组用法

这次的博客给大家带来点lambda中groupBy分组语法的使用

首先我们新建一个对象,通过这个对象的集合来进行学习:

@Data
@Builder
public class Person (){
      private int grade;
      private boolean isBoy;
}

 很简单的一个类,grade表示年级,isBoy表示性别,男为true;

@Data、@Builder为lombok插件的注解,帮助我们生成get/set/equals/toString/Builder等方法

下面我们建立测试类:

public class GroupBy_Lambda{
      omitted....
}

首先我们建立一个集合并初始化:

private static List<Person> init (){
        List<Person> persons = new ArrayList<>();
        for ( int i = 0; i < 20; i++ ){
            Person.PersonBuilder personBuilder = Person.builder();
            personBuilder.grade(i % 2);
            Person person = i % 2 == 0 ? personBuilder.isBoy(true).build()  : personBuilder.isBoy(false).build();
            persons.add(person);
        }
        return persons;
    }

接下来我们进行分组:

 List<Person> persons = init();
 Map<Integer, List<Person>> groupByGrade = persons.stream()
                .collect(groupingBy(Person::getGrade));
System.out.println(groupByGrade);

 这里,我们是根据grade进行了分组,key为grade,value为相应Person的集合。

persons.stream():将集合转为流,之后便能使用lambda表达式

.collect():相当于一个收集器,可以将我们分组后的流进行收集

groupingBy():我们本次分组所使用的分组工具、按照grade进行分组

Person::getGrade:调用Person的getGrade方法

输出的结果为:

{0=[Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true)], 
1=[Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false)]}

 可以看到,我们已经完成了按照grade进行分组的工作。

如果还想要进一步进行提取的话,groupingBy()还为我们提供了更多的方法,比如:

Map<Integer, List<Boolean>> groupByGrade_sex = persons.stream()
                .collect(groupingBy(Person::getGrade,
                        mapping(Person::isBoy, toList())));
System.out.println(groupByGrade_sex)

 我们在groupingBy方法的内部,又进行了细分,只取出isBoy这个字段的值并收集

下面是输出的结果:

{0=[true, true, true, true, true, true, true, true, true, true], 
1=[false, false, false, false, false, false, false, false, false, false]}

lambda表达式为我们提供了很多简便的用法帮助我们进行开发,希望大家能有所收获

猜你喜欢

转载自zk-chs.iteye.com/blog/2282325
今日推荐