我们经常在工作中会碰到这种情况:让我将对象结合中的对象按照对象的某个属性的值进行操作,然后根据值对集合中的对象进行分组。
这种情况听上去不是很难,但是在做起来的时候就会很麻烦。对不清楚Java8新特性的朋友来说,你可能会遍历数组对对象属性进行操作判断,然后在创建几个List对象去存储分组后的对象,这可能需要十几行代码。
然而今天,我们来学习一下Java8的其中一个新特性:集合的流式编程,让这种操作只要几行代码搞定。
1.准备好一个实体类
public class Person{
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
2.准备好一个集合
ArrayList<Person> people = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
Person person = new Person();
person.setAge(i);
String l = i % 2 == 0 ? "偶数" : "奇数";
person.setName(l+"-"+i);
people.add(person);
}
这里我循环插入了一百个对象,对象的age直接赋值为每次循环的i值,name值则为当前i是否为偶数再加上“-”和当前i的值。
操作一:对person的age属性进行操作,将根据age的奇偶性进行分组
Map<Boolean, List<Person>> collect = people.stream().collect(Collectors.groupingBy(l -> {
Integer age = l.getAge();
return age % 2 == 0;
}));
好了,分完组后,他会返回一个Map集合,key值是分组的所依据的值,value就是分好组后的集合,接下来让我看看结果
List<Person> personList1 = collect.get(true);
List<Person> personList2 = collect.get(false);
personList1.forEach(System.out::println);
System.out.println("===============");
personList2.forEach(System.out::println);
Person{
age=2, name='偶数-2'}
Person{
age=4, name='偶数-4'}
Person{
age=6, name='偶数-6'}
Person{
age=8, name='偶数-8'}
...
===============
Person{
age=1, name='奇数-1'}
Person{
age=3, name='奇数-3'}
Person{
age=5, name='奇数-5'}
Person{
age=7, name='奇数-7'}
Person{
age=9, name='奇数-9'}
...
这里由于每个集合中都有50个对象,所以我就挑了前面几条进行展示。
操作二:在name中获得“-”后的数字,并根据其对5取余的值进行分组
Map<Integer, List<Person>> collect = people.stream().collect(Collectors.groupingBy(l -> {
String name = l.getName();
String[] split = name.split("-");
int parseInt = Integer.parseInt(split[1]);
return parseInt % 5;
}));
Person{
age=5, name='奇数-5'}
Person{
age=10, name='偶数-10'}
Person{
age=15, name='奇数-15'}
Person{
age=20, name='偶数-20'}
...
============
Person{
age=1, name='奇数-1'}
Person{
age=6, name='偶数-6'}
Person{
age=11, name='奇数-11'}
Person{
age=16, name='偶数-16'}
============
Person{
age=2, name='偶数-2'}
Person{
age=7, name='奇数-7'}
Person{
age=12, name='偶数-12'}
Person{
age=17, name='奇数-17'}
...
============
Person{
age=3, name='奇数-3'}
Person{
age=8, name='偶数-8'}
Person{
age=13, name='奇数-13'}
Person{
age=18, name='偶数-18'}
...
============
Person{
age=4, name='偶数-4'}
Person{
age=9, name='奇数-9'}
Person{
age=14, name='偶数-14'}
Person{
age=19, name='奇数-19'}
...
通过这种方法,无论你对需要分组的属性值进行多复杂的计算或操作,只要最后他们返回的结果一致,他们就会分到一个组中,并且组名就是他们的返回值。
如果对你有用的话麻烦点个赞把。