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.
首先,您不必将其拆分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)
| 归档时间: |
|
| 查看次数: |
16698 次 |
| 最近记录: |