Ваш подход в основном правильный, в Splitter Guava нет API для синтаксического анализа значений определенным образом, поэтому вам придется выполнять итерацию дважды (если вы не решите сбросить MapSplitter
и просто использовать Splitter
с вашими собственными значениями, анализируемыми вцикл).
Тем не менее, есть удобная коллекция ala Map<Foo, Collection<Bar>>
, которая Multimap
- в вашем случае SetMultimap
(предпочтительно ImmutableSetMultimap
), напр .: * 10101
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]}