首页 > 解决方案 > 如何使用 Java Stream 转换这段代码

问题描述

为了防御XSS攻击,我写了一个类,继承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

欢迎提出任何改进此代码性能的建议。

标签: javajava-stream

解决方案


是的,您可以使用流加上映射/过滤器来制作优雅的解决方案,但它将重新分配请求数据的内存占用,为 Map、N * Map.Entry、N * String[] 和过滤字符串和其他中间步骤。

或者考虑简化现有循环的逻辑,以将每个String[]值固定到位并返回现有映射:

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;
}

推荐阅读