我有一个TreeMap<String,String>
,我需要将其转换为类似于URI的字符串,然后再转回Map。
我需要设置自定义分隔符。
有没有任何工具(Guava,Apache Commons?)可以帮我完成?我知道我可以编写简单的循环,但我正在寻找一行代码解决方法 :)
例如
key value
key1 val1
key2 val2
key1_val1|key2_val2
我有一个TreeMap<String,String>
,我需要将其转换为类似于URI的字符串,然后再转回Map。
我需要设置自定义分隔符。
有没有任何工具(Guava,Apache Commons?)可以帮我完成?我知道我可以编写简单的循环,但我正在寻找一行代码解决方法 :)
例如
key value
key1 val1
key2 val2
key1_val1|key2_val2
根据David Tulig的说法,您可以通过Guava来实现此操作。
String string = Joiner.on("|").withKeyValueSeparator("_").join(map);
相反的也可以通过以下方式实现
Map<String, String> map = Splitter.on("|").withKeyValueSeparator("_").split(string);
使用Java8:
private static Map<String, String> prepareMap() {
Map<String, String> map = new LinkedHashMap<>();
map.put("key1", "val1");
map.put("key2", "val2");
return map;
}
@Test
public void toStr() {
assertEquals("key1_val1|key2_val2", prepareMap().entrySet().stream()
.map(e -> e.getKey() + "_" + e.getValue())
.collect(Collectors.joining("|")));
}
@Test
public void toStrFunction() {
assertEquals("key1_val1|key2_val2", joiner("|", "_").apply(prepareMap()));
}
private static Function<Map<String, String>, String> joiner(String entrySeparator, String valueSeparator) {
return m -> m.entrySet().stream()
.map(e -> e.getKey() + valueSeparator + e.getValue())
.collect(Collectors.joining(entrySeparator));
}
@Test
public void toMap() {
assertEquals("{key1=val1, key2=val2}", Stream.of("key1_val1|key2_val2".split("\\|"))
.map(e -> e.split("_", 2))
.collect(Collectors.toMap(e -> e[0], e -> e.length > 1 ? e[1] : null)).toString());
}
@Test
public void toMapFunction() {
assertEquals("{key1=val1, key2=val2}", splitter("\\|", "_").apply("key1_val1|key2_val2").toString());
}
private static Function<String, Map<String, String>> splitter(String entrySeparator, String valueSeparator) {
return s -> Stream.of(s.split(entrySeparator))
.map(e -> e.split(valueSeparator, 2))
.collect(Collectors.toMap(e -> e[0], e -> e.length > 1 ? e[1] : null));
}
这不是guava或apache commons,它是一个循环,但除了实例化字符串构建器之外,它只有一行代码:
for (Entry<String,String> entry : myMap.entrySet()) {
sb.append(entry.getKey() + separator + entry.getValue() + "\n");
}
List<String> cities = Arrays.asList("Milan",
"London",
"New York",
"San Francisco");
String citiesCommaSeparated = String.join(",", cities);
System.out.println(citiesCommaSeparated);
//Output: Milan,London,New York,San Francisco
本内容的鸣谢和示例来自于this URL (https://reversecoding.net/java-8-convert-list-string-comma/)