拆分字符串并将其存储到HashMap java 8中

San*_*ose 7 java arraylist hashmap java-8 java-stream

我想分割下面的字符串并将其存储到HashMap中.

String responseString = "name~peter-add~mumbai-md~v-refNo~"; 
Run Code Online (Sandbox Code Playgroud)

首先,我使用分隔符连字符( - )拆分字符串并将其存储到ArrayList中,如下所示:

 public static List<String> getTokenizeString(String delimitedString, char separator) {
    final Splitter splitter = Splitter.on(separator).trimResults();
    final Iterable<String> tokens = splitter.split(delimitedString);
    final List<String> tokenList = new ArrayList<String>();
    for(String token: tokens){
        tokenList.add(token);
    }
    return tokenList;
}
List<String> list = MyClass.getTokenizeString(responseString, "-");
Run Code Online (Sandbox Code Playgroud)

然后使用下面的代码将其转换为使用流的HashMap.

HashMap<String, String> = list.stream()
                          .collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1]));
Run Code Online (Sandbox Code Playgroud)

流收集器不起作用,因为没有refNo的值.

如果我在ArrayList中有偶数个元素,它可以正常工作.

有办法处理这个吗?还建议我如何使用流来执行这两个任务(我不想使用getTokenizeString()方法)使用流java 8.

Hol*_*ger 16

除非Splitter做任何魔术,否则这个getTokenizeString方法已经过时了.您可以将整个处理作为单个操作执行:

Map<String,String> map = Pattern.compile("\\s*-\\s*")
    .splitAsStream(responseString.trim())
    .map(s -> s.split("~", 2))
    .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));
Run Code Online (Sandbox Code Playgroud)

通过使用正则表达式\s*-\s*作为分隔符,您将白色空间视为分隔符的一部分,因此隐式修剪条目.trim在处理条目之前只有一个初始操作,以确保在第一个条目之前或之后没有空白区域.

然后,map在收集到一个步骤之前,只需在一个步骤中拆分条目Map.

  • @VishwaRatna 因为这是两个独立的操作,具有不同的语义,所以独立执行它们没有任何问题。您应该避免的是执行冗余操作,例如在原始代码中对同一输入执行两次的`split("~")`。 (2认同)

Era*_*ran 5

首先,您不必将其拆分String两次。
第二,检查数组的长度,以确定给定键是否存在值。

HashMap<String, String> = 
    list.stream()
        .map(s -> s.split("~"))
        .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : ""));
Run Code Online (Sandbox Code Playgroud)

这是假设您要在键null没有对应值的情况下为键添加值。

或者您可以跳过list变量:

HashMap<String, String> = 
    MyClass.getTokenizeString(responseString, "-")
        .stream()
        .map(s -> s.split("~"))
        .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : ""));
Run Code Online (Sandbox Code Playgroud)