这对我有用:
class StreamToInflateStringToMap {
private static Function<String, String> keyMapper =
s -> s.substring(0, s.indexOf(":"));
private static Function<String, String> valueMapper =
s -> s.substring(s.indexOf(":") + 1);
public static Map<String, String> inflateStringToMap(String flatString) {
return Stream.of(flatString.split(";")).
collect(Collectors.toMap(keyMapper, valueMapper));
}
public static void main(String[] args) {
String flatString = "type:fruit;color:yellow;age:5";
System.out.println("Flat String:\n" + flatString);
Map<String, String> inflatedMap = inflateStringToMap(flatString);
System.out.println("Inflated Map:\n" + inflatedMap);
}
}
请注意,我假设您的意思是您想要一个解决分号丢失时的解决方案(即:地图中只有一个项目)。如果没有冒号,那么抛出异常是完全正确的,因为这意味着字符串中没有定义映射,并且必须将错误的值传递给方法。
Alexey Romanov 提出的评论也是有效的:你能保证在内容中不会找到分隔符作为实际键/值字符串的一部分吗?如果不是,那么您将遇到麻烦(无论您使用何种膨胀方法),因此可能需要验证放入地图原始副本中的值。
还请注意,我已将 Function<String, String> 映射器声明为该类的静态成员,但如果您永远不需要在其他任何地方使用它们并且您认为它不会使代码太丑了。
此外,通过 Java 8 API 的一些探索发现了另一种方法,可以从分隔符分隔的 String 创建 Stream。您可以使用Pattern.splitAsStream(CharSequence) 方法,如下所示:
private static final Pattern SINGLE_SEMICOLON = Pattern.compile(";");
public static Map<String, String> inflateStringToMap(String flatString) {
return SINGLE_SEMICOLON.splitAsStream(flatString).
collect(Collectors.toMap(keyMapper, valueMapper));
}
(注意warning in the API 将可变的CharSequence 类型(例如StringBuilder)提供给splitAsStream 方法。)