如何使用 Java Stream 转换这段代码
How to transform this piece of code using Java Stream
为了防御XSS攻击,我写了一个class,扩展自HttpServletRequestWrapper
,重写了getParameterValues
方法,代码如下:
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
LinkedHashMap<String, String[]> map = new LinkedHashMap<>();
if (parameters != null) {
for (String key : parameters.keySet()) {
String[] values = parameters.get(key);
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
values[i] = value;
}
map.put(key, values);
}
}
return map;
}
我想知道这段代码是否可以使用Java Stream进行转换,因为我看到很多if
条件判断和for
循环。
方法:StrUtil.hasEmpty
和HtmlUtil.filter
来自这里:Hutool
欢迎提出任何改进此代码性能的建议。
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
LinkedHashMap<String, String[]> map = new LinkedHashMap<>();
if (parameters != null) {
map = parameters.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
v -> Arrays.stream(v.getValue())
.filter(val -> !StrUtil.hasEmpty(val))
.map(HtmlUtil::filter).collect(Collectors.toList()).toArray(new String[0]),
(x, y) -> y, LinkedHashMap::new
));
}
return map;
}
是的,您可以使用流加映射/过滤器来制定优雅的解决方案,但它会重新分配请求数据的内存占用,为 Map、N * Map.Entry、N * String 的对象创建许多新的[],以及过滤字符串和其他中间步骤。
或者考虑简化现有循环的逻辑,仅修复每个 String[]
值和 return 现有映射:
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
if (parameters != null) {
for (String[] values : parameters.values()) {
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
values[i] = HtmlUtil.filter(value);
}
}
}
}
return parameters;
}
为了防御XSS攻击,我写了一个class,扩展自HttpServletRequestWrapper
,重写了getParameterValues
方法,代码如下:
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
LinkedHashMap<String, String[]> map = new LinkedHashMap<>();
if (parameters != null) {
for (String key : parameters.keySet()) {
String[] values = parameters.get(key);
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
values[i] = value;
}
map.put(key, values);
}
}
return map;
}
我想知道这段代码是否可以使用Java Stream进行转换,因为我看到很多if
条件判断和for
循环。
方法:StrUtil.hasEmpty
和HtmlUtil.filter
来自这里:Hutool
欢迎提出任何改进此代码性能的建议。
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
LinkedHashMap<String, String[]> map = new LinkedHashMap<>();
if (parameters != null) {
map = parameters.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
v -> Arrays.stream(v.getValue())
.filter(val -> !StrUtil.hasEmpty(val))
.map(HtmlUtil::filter).collect(Collectors.toList()).toArray(new String[0]),
(x, y) -> y, LinkedHashMap::new
));
}
return map;
}
是的,您可以使用流加映射/过滤器来制定优雅的解决方案,但它会重新分配请求数据的内存占用,为 Map、N * Map.Entry、N * String 的对象创建许多新的[],以及过滤字符串和其他中间步骤。
或者考虑简化现有循环的逻辑,仅修复每个 String[]
值和 return 现有映射:
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
if (parameters != null) {
for (String[] values : parameters.values()) {
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
values[i] = HtmlUtil.filter(value);
}
}
}
}
return parameters;
}