【发布时间】:2021-03-08 01:46:18
【问题描述】:
我有一个输入字符串,我想将它放入 HashMap。 字符串(这不是 url 参数)看起来像:source=google&date=2019-01-01&...
public Map<String, String> extract(String source) {
return Arrays.stream(source.split("&"))
.map(s -> s.trim().split("="))
.peek(pairs -> pairs[0] = convert(pairs[0])
.filter(this::isValid)
.collect(Collectors.toMap(
key -> key[0],
value -> value[1],
(val1, val2) -> val2)
);
}
private boolean isValid(String[] strings) {
return strings.length == 2
&& !strings[0].isBlank()
&& !strings[1].isBlank();
}
上面字符串的结果是:[source=google, date=2019-01-01, ..]
但如果字符串有空格,例如: source = google & date= 2019-01-01,结果将是[ source = google, ...]。
我想删除空格,所以我添加:
.map(s -> s.trim().split("="))
.peek(this::removeWhiteSpaces)
private void removeWhiteSpace(String [] strings) {
strings[0] = strings[0].trim();
strings[1] = strings[1].trim();
string[0] = convert(string[0]);
}
它工作正常,但现在如果不能将 String 拆分为具有 2 个元素的数组,如下所示:source campaign&date... 它将抛出 ArrayIndexOutOfBoundException,因为 string[1] 不存在。所以我把filter移到peek上方:
.filter(this::isValid)
.peek(pairs -> pairs[0] = convert(pairs[0])
现在 String source campaign&date... 不会通过过滤器,但这里还有一个问题。
方法convert 可以返回空字符串“”,我应该过滤它们。这就是为什么 filter 在 peek 运算符之后。我可以用两个过滤器解决它,如下所示:
.map(s -> s.trim().split("="))
.filter(strings -> strings.length==2)
.peek(this::removeWhiteSpaces)
.filter(strings -> !strings[0].isBlank() && !strings[1].isBlank())
.collect(..)
但是我可以用一个过滤器做到这一点吗?可能我的流链一点都不好?
UPD
convert方法:
private String convert(String string) {
return conversionTable.getOrDefault(string, ""); //map with key/values
}
【问题讨论】:
-
您想删除结果中的任何空格还是只删除前导空格?
-
whitespace this is a string whitespace应该是this a string。同时用于键和值(由 = 分隔)。如此领先和落后。 -
你说结果会是
[ source = google, ...]为什么不是[source=google,... -
你在找
return Arrays.stream(source.split("&")) .map(s -> Arrays.stream(s.split("=")) .map(String::trim) .toArray(String[]::new) ).filter(this::isValid) .collect(Collectors.toMap(x -> x[0], x -> x[1])); -
is peek really only for debugging? 已在五年前被要求回答 那个 问题。除此之外,你为什么不首先使用
.split("\\s*&\\s*")和.split("\\s*=\\s*"),而不是在额外的操作中删除空白?
标签: java string java-stream