2016-08-30 25 views
2

我一直在四处寻找重建地图,但不能拿出使用Java 8优雅实用的解决方案这是我要解决的问题:功能的解决方案,从字符串

我有“序列化”的地图进入一个字符串,例如

{ type -> 'fruit', 
    color -> 'yellow', 
    age -> 5 } 

将成为:

type:fruit;color:yellow;age:5 

现在,我要重新从字符串的原始地图

Arrays.stream(input.split(";")) 
     .map(v -> v.split(":")) 
     .collect(Collectors.toMap(c -> c[0], c -> c.[1]); 

注意上面的代码将导致NullPointerException如果没有“:”在列表中,这可以与解决:

c.length > 1 ? c[1] : c[0] 

但是,这感觉不对。任何使用Java8 API的建议或替代方案?

+4

如果在值内有';'或':'会怎么样? –

回答

3

这个工作对我来说:

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>映射器声明为类的静态成员,但是如果您不需要在其他任何地方使用它们,并且您认为它不会生成代码,则可以将它们直接拖入Stream流中太丑了。

此外,通过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类型,如StringBuildersplitAsStream方法。)

0

如果你有番石榴,你可以使用

Splitter.on(';').withKeyValueSeparator(':').split(input) 
相关问题