Guava Splitter 生成具有设定值的地图

Guava Splitter to produce as map with set value

使用 Guava Splitter 将下面的字符串转换为 Map <Key, Set<String>> 的最佳方法是什么?

String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";

这是我尝试过的方法:

String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
Map<String, Set<String>> pairMap = new HashMap<String, Set<String>>();

Map<String, String> map = Splitter.on(';')
        .withKeyValueSeparator(':')
        .split(pairs);

map.forEach((key, value) -> {
    pairMap.put(key, Splitter.on(',').splitToList(value).stream().collect(Collectors.toSet()));
});

pairMap.forEach((key, valueSet) ->{
    System.out.println("key: "+key);
    valueSet.forEach(value ->{
        System.out.println(value);
    });
});

你的方法大部分是正确的,Guava 的 Splitter 中没有 API 以特定方式解析值,所以你必须迭代两次(除非你决定删除 MapSplitter 并只使用 Splitter 用你自己的值在循环中解析)。

就是说,有方便的集合 ala Map<Foo, Collection<Bar>>,即 Multimap -- in your case SetMultimap (preferably ImmutableSetMultimap),例如:

String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";

Map<String, String> map = Splitter.on(';')
    .withKeyValueSeparator(':')
    .split(pairs);

ImmutableSetMultimap<String, String> pairMap = map.entrySet().stream()
    .collect(ImmutableSetMultimap.flatteningToImmutableSetMultimap(
        Map.Entry::getKey,
        e -> Streams.stream(Splitter.on(',').split(e.getValue()))));

System.out.println(pairMap);
// {cat=[01, 02, 03], dog=[AA, BB, CC], fish=[A1, A2]}