我有一个特定格式的字符串,所以我想将该字符串解析为映射。我有一个下面的方法,它将字符串解析为映射,并且工作正常。
public static Map<String, String> parseStringToMap(String payload) {
try {
return Maps.newHashMap(Splitter.on("|").withKeyValueSeparator("=").split(payload));
} catch (Exception ex) {
return ImmutableMap.of();
}
}
字符串示例:
"type=3|Id=23456|user=13456"
现在,有时当我在同一个字符串 payload
中有两次相同的键和相同的值时,我的上述方法会失败并抛出异常。例如,对于下面的字符串,它不起作用并且失败,然后返回空映射,因为它有两次 type
键。
"type=3|Id=23456|user=13456|type=3"
我可以做什么来解决这个问题而不是修复字符串有效负载?因此,假设如果相同的键出现多次,则覆盖映射中的该键值而不是失败。我想返回一个可变映射。
我仍在使用 Java 7。执行此操作的最佳且有效的方法是什么?
最佳答案
文档说如果有重复的键, split 将抛出异常:
@CheckReturnValue public Map split(CharSequence sequence)
Splits sequence into substrings, splits each substring into an entry, and returns an unmodifiable map with each of the entries. For example, Splitter.on(';').trimResults().withKeyValueSeparator("=>") .split("a=>b ; c=>b") will return a mapping from "a" to "b" and "c" to b.
The returned map preserves the order of the entries from sequence.
Throws: IllegalArgumentException - if the specified sequence does not split into valid map entries, or if there are duplicate keys
所以,您不能使用 MapSplitter 的分割,抱歉!
使用 Java 8:
return Splitter
.on("|")
.splitToList(payload)
.stream()
.map(kv -> kv.split("="))
.collect(Collectors.toMap(kv -> kv[0], kv -> kv[1], (d1, d2) -> d1));
关于java - 将格式化字符串解析为多次具有相同键的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46352440/