如何使用 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.hasEmptyHtmlUtil.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;
}