我有一种从字符串中提取键值的方法:
public Map<String, String> extract(String input) {
return Arrays.stream(input.split("&"))
.map(subString -> subString.split("="))
.map(this::convertStringArr)
.filter(strings -> !strings[0].isBlank())
.collect(Collectors.toMap(
key -> key[0],
value -> value[1],
(val1, val2) -> val2));
}
此方法转换密钥:
private String[] convertStringArr(String[] input) {
String [] arr = new String[input.length];
for (int i = 0; i < arr.length; i++) {
arr[0] = convert(input[0]);
arr[1] = input[1];
}
return arr;
}
和转换传入密钥的方法:
//it's not a real method, it's just imitates iteraction with database, but 100% same functionality
private String convert(String inputs) {
switch (input) {
case "book_author":
return "ga:author";
case "book_id":
return "ga:id";
case "book_source":
return "ga:marketplace";
case "book_target":
return "";
default:
return input;
}
}
我的主要目标是:从字符串中提取键和值,转换键,过滤空键并将其收集到映射。
这可行,但是我想重构convertStringArr(String[] input)
方法,而无需创建新数组,循环等。我该怎么办?
请记住此功能:字符串拆分为数组,每个数组始终包含2个值,[0]-始终是键,[1]-始终是值。我需要在将其收集到地图之前转换密钥,因为没有它,我将拥有一个带有空密钥的地图(这就是为什么我在地图之后有一个过滤器)。
有任何想法吗?
您可以这样做:
return Arrays.stream(input.split("&"))
.map(subString -> subString.split("="))
.collect(Collectors.toMap(
key -> convert(key[0]), // call convert here!
value -> value[1],
(val1, val2) -> val2
));
这样做的一个小问题是,这将使您留下带有""
钥匙的地图。您可能要删除它:
Map<String, String> map = Arrays.stream(input.split("&"))
.map(subString -> subString.split("="))
.collect(Collectors.toMap(
key -> convert(key[0]),
value -> value[1],
(val1, val2) -> val2
));
map.remove("");
return map;
或者,如果您不介意convert
多次致电,请使用filter
return Arrays.stream(input.split("&"))
.map(subString -> subString.split("="))
.filter(x -> !convert(x[0]).isBlank())
.collect(Collectors.toMap(
key -> convert(key[0]),
value -> value[1],
(val1, val2) -> val2
));
无论如何,假设您正在返回地图,则调用代码""
无论如何都不会尝试访问该键,因此您可能不需要以任何一种方式将其删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句