聊骚
相信大家都碰到过这样的场景
需要将一个列表根据列表中的实体的某个字段进行分类。
比较典型的场景就是我们查询多对多的结果。
那么我们一般的方法就是:
- 创建Map,key为对应字段,value为对应列表;
- 遍历列表,根据实体字段去map获取对应列表,再将数据放到对应列表。
逻辑比较简单,但是还是要一定的代码行数的。
有没有一种简单的方法?guava的MultiMap就是
maven jar
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>26.0-jre</version>
</dependency>
代码实例
private List<User> list = new ArrayList<>();
@Before
public void init(){
User user = new User();
user.setId(1L);
user.setName("张三");
user.setAge(23);
list.add(user);
user = new User();
user.setId(2L);
user.setName("李四");
user.setAge(22);
list.add(user);
user = new User();
user.setId(3L);
user.setName("张三");
user.setAge(25);
list.add(user);
}
@Test
public void testMultiMap() {
Multimap<String, User> multiMap = ArrayListMultimap.create();
for (User u : list) {
multiMap.put(u.getName(), u);
}
for (Map.Entry<String, Collection<User>> entry : multiMap.asMap().entrySet()){
System.out.println(entry.getKey());
}
}
@Test
public void testListToMap(){
Map<String, List<User>> userMap = new HashMap<>();
for (User u : list){
if (userMap.containsKey(u.getName())){
userMap.get(u.getName()).add(u);
}else {
List<User> users = new ArrayList<>();
users.add(u);
userMap.put(u.getName(), users);
}
}
for (Map.Entry<String, List<User>> entry : userMap.entrySet()){
System.out.println(entry.getKey());
}
}