我正在尝试使用流将 List
转换为 Map
而不重复,但我无法实现。
我可以使用这样的简单循环来做到这一点:
List<PropertyOwnerCommunityAddress> propertyOwnerCommunityAddresses = getPropertyOwnerAsList();
Map<Community, List<Address>> hashMap = new LinkedHashMap<>();
for (PropertyOwnerCommunityAddress poco : propertyOwnerCommunityAddresses) {
if (!hashMap.containsKey(poco.getCommunity())) {
List<Address> list = new ArrayList<>();
list.add(poco.getAddress());
hashMap.put(poco.getCommunity(), list);
} else {
hashMap.get(poco.getCommunity()).add(poco.getAddress());
}
}
但是当我尝试使用流时,我的思绪崩溃了。
我不得不说
PropertyOwnerCommunityAddress
还包含两个对象:Community
和 Address
,所有这些的目标是为每个社区保存一个 key:value
对中的地址,而不会重复 Community
对象。任何人都可以帮助我吗?谢谢!
最佳答案
由于每个 Address
可以有多个 Community
es,因此您不能使用 toMap()
收集器,但您需要使用 groupingBy()
:
Map<Community, List<Address>> map = propertyOwnerCommunityAddresses.stream()
.collect(Collectors.groupingBy(
PropertyOwnerCommunityAddress::getCommunity,
Collectors.mapping(
PropertyOwnerCommunityAddress::getAddress,
Collectors.toList())
)
);
根据您的个人喜好,这看起来可能比简单的for循环更困惑,也可能更复杂,后者也可以进行优化:
for(PropertyOwnerCommunityAddress poco : propertyOwnerCommunityAddresses) {
hashMap.computeIfAbsent(poco.getCommunity(), c -> new ArrayList<>()).add(poco.getAddress());
}
根据您是否只想拥有唯一地址,您可能想要使用
Set
,因此将 Collectors.toList()
更改为 Collectors.toSet()
,或者当您继续使用 for 循环时,将 hashMap
的定义更改为 Map<Community, Set<Address>>
并在循环中将 new ArrayList<>()
与 new HashSet<>()
交换