将Set设置为Map

时间:2017-02-17 11:32:55

标签: java java-8 collectors

我正在尝试使用收集器使用java 8将Set转换为Map。

Set<B2BUnitModel> payersList = ..... 
final Map<B2BUnitModel, List<B2BUnitPartnershipModel>> b2bUnitPartnershipMap = new HashMap<>();
final Map<B2BUnitModel, Object> map = payersList.stream().collect(Collectors.toMap(Function.identity(), Arrays::asList));
b2bUnitPartnershipMap.putAll(map); // Will throw Type Cast Error

我无法理解如何将Map值转换为B2BUnitPartnershipModel类型,因为Arrays::asList只返回Object类型。

我有什么方法可以在Collectors.toMap(Function.identity(), Arrays::asList)本身写一些内容,以便api返回所需的地图(Map<B2BUnitModel, List<B2BUnitPartnershipModel>>而不是Map<B2BUnitModel, Object>)。

我想创建一个带有Set值的Map作为键并清空B2BUnitPartnershipModel列表。

2 个答案:

答案 0 :(得分:4)

假设B2BUnitModelKeyB2BUnitPartnershipModelValue,以下代码会使用lambda expressions生成一个地图,其中包含来自集合和空列表的键作为值method references

代码

@Test
public void testMapCollector() {

    Set<Key> keySet = new HashSet<>();
    keySet.add(new Key("key1"));
    keySet.add(new Key("key2"));
    keySet.add(new Key("key3"));

    Map<Key, List<Value>> map = keySet.stream().collect(
            Collectors.toMap(k -> k, key -> new ArrayList<>()));

    System.out.println(map);

}

class Key {
    String key;

    public Key(String value) {
        this.key = value;
    }

    @Override
    public String toString() {
        return "Key [key=" + key + "]";
    }
}

class Value {
}

输出

{Key [key=key1]=[], Key [key=key3]=[], Key [key=key2]=[]}

答案 1 :(得分:2)

您的Arrays::asList会导致问题。试试这个:

Map<B2BUnitModel, List<B2BUnitPartnershipModel>> map = set.stream().collect(Collectors.toMap(Function.identity(), unit -> new ArrayList<>()));