我正在尝试使用流将 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 还包含两个对象:CommunityAddress,所有这些的目标是为每个社区保存一个 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<>() 交换

10-05 19:36