Lambda中groupBy分组⽤法这次的博客给⼤家带来点lambda中groupBy分组语法的使⽤
⾸先我们新建⼀个对象,通过这个对象的集合来进⾏学习:
@Data
@Builder
public class Person (){
private int grade;
groupby分组private boolean isBoy;
}
很简单的⼀个类,grade表⽰年级,isBoy表⽰性别,男为true;
@Data、@Builder为lombok插件的注解,帮助我们⽣成get/set/equals/toString/Builder等⽅法
下⾯我们建⽴测试类:
public class GroupBy_Lambda{
<
}
⾸先我们建⽴⼀个集合并初始化:
private static List<Person> init (){
List<Person> persons = new ArrayList<>();
for ( int i = 0; i < 20; i++ ){
Person.PersonBuilder personBuilder = Person.builder();
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)
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), Pe 可以看到,我们已经完成了按照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表达式为我们提供了很多简便的⽤法帮助我们进⾏开发,希望⼤家能有所收获
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论