这里的需求是分组,就是集合按照相同的属性来分组。一般默认的做法就是定义一个对象,然后利用java8流对象的分组方法来分组,在分组函数中,传入一个属性get方法。如下所示:
package com.xxx.map;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class ListMapGroupByExample {
public static void main(String[] args) {
List<UseCase> list = new ArrayList<>();
list.add(new UseCase(1,"test01"));
list.add(new UseCase(1,"test02"));
list.add(new UseCase(2,"test02"));
list.add(new UseCase(3,"test03"));
Map<Integer,List<UseCase>> groupedList = list.stream().collect(Collectors.groupingBy(UseCase::getSn));
System.out.println(groupedList);
}
}
class UseCase {
private int sn;
private String name;
public int getSn() {
return sn;
}
public String getName() {
return name;
}
public UseCase(int sn,String name) {
this.sn = sn;
this.name = name;
}
@Override
public String toString() {
return "{" +
"sn=" + sn +
", name='" + name + '\'' +
'}';
}
}
运行程序,打印结果如下:
{1=[{sn=1, name='test01'}, {sn=1, name='test02'}], 2=[{sn=2, name='test02'}], 3=[{sn=3, name='test03'}]}
返回结果是一个属性与列表的map映射。相同的sn为一组,这里按照sn分成了3组,第一组里面有两个sn相同,所以它的集合里有两个对象。
=====================
这里的UseCase::getSn是一个方法函数,goupingBy(Function)需要传入一个函数。这里如果我们不使用UseCase对象,而是使用map映射,这里需要怎么来传参呢?示例如下:
List<Map<String,Object>> mapList = new ArrayList<>();
mapList.add(new HashMap<>(){{put("sn",1);put("name","test01");}});
mapList.add(new HashMap<>(){{put("sn",1);put("name","test02");}});
mapList.add(new HashMap<>(){{put("sn",2);put("name","test02");}});
mapList.add(new HashMap<>(){{put("sn",3);put("name","test03");}});
Map<Integer,List<Map>> groupedList2 = mapList.stream().collect(Collectors.groupingBy(e->(Integer) e.get("sn")));
System.out.println(groupedList2);
运行结果:
{1=[{name=test01, sn=1}, {name=test02, sn=1}], 2=[{name=test02, sn=2}], 3=[{name=test03, sn=3}]}
这里的结果和上面使用UseCase对象的时候一样,相同sn的被分到了一组。
这里我们传入的是一个lambda表达式函数,表达式是求map映射中sn的值,和使用对象传入UseCase::getSn效果是一样的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)