Stream流如何实现双层map
时间: 2023-07-07 17:18:11 浏览: 224
map/multimap属于**关联式容器**,底层结构是用二叉树实现
实现双层map可以通过Stream流的collect方法,结合Collectors.toMap()和Collectors.groupingBy()实现。
假设我们有一个包含多个Person对象的List,Person对象有id和name两个属性。我们需要按照id和name进行双层map的分组,可以使用下面的代码:
```
List<Person> personList = ...;
Map<Integer, Map<String, List<Person>>> result = personList.stream()
.collect(Collectors.groupingBy(Person::getId, Collectors.groupingBy(Person::getName)));
```
上述代码中,首先按照id进行分组,然后对每个id分组下的元素再按照name进行分组,最终得到一个双层map的结果。
注意,由于Map的key不能重复,上述代码中的第二个groupingBy方法使用的是默认的HashMap实现,如果需要保持插入顺序或使用其他Map实现,可以使用Collectors.toMap()方法,例如:
```
List<Person> personList = ...;
Map<Integer, Map<String, List<Person>>> result = personList.stream()
.collect(Collectors.groupingBy(Person::getId,
Collectors.toMap(Person::getName,
Function.identity(),
(v1, v2) -> v1,
LinkedHashMap::new)));
```
上述代码中,第二个参数使用toMap方法,指定了Map的value为Person对象本身,第三个参数指定了当key重复时如何处理,这里使用了v1保持原有值不变,第四个参数指定了使用LinkedHashMap作为Map的实现,保持插入顺序。
阅读全文