有没有一种方法可以使用Java流优化Map内的find元素?

时间:2019-05-10 11:56:06

标签: java java-8 java-stream

我有一个由字符串作为键和对象列表作为值的哈希图。我需要从此列表中提取具有特定字符串作为键的记录。同样在每条记录包含的值列表中,我需要将特定属性设置为true的记录。

我已经开发了使用Java流的可行解决方案。由于此代码是在有关执行时间的关键任务中使用的,所以我想知道是否无法优化我的代码以使其更快。

private HashMap<String, List<RewriteBase>> rewriteUrl;

public static class RewriteBase {
    @NotNull
    private String  urlRegex;
    @NotNull
    private String  proxyPres;
    private boolean enable;
    private boolean insensitive;
}

Map<String, List<RewriteBase>> rewriteBaseList = GetRewriteUrl();

Map<String, List<RewriteBase>> result = rewriteBaseList.entrySet().stream()
    .filter(valore -> path.startsWith(valore.getKey()))
    .collect(Collectors.toMap(Entry::getKey, p -> p.getValue().stream()
    .filter(value -> value.isEnable()).collect(Collectors.toList())));

数据源:

rewriteUrl:
    '[/urla/urlb/sc]':
    -
        urlRegex: /prea/sc
        proxyPres: /evm
        enable: true
        insensitive: true
    -
        urlRegex: header-logo
        proxyPres: /evm
        enable: false
        insensitive: true
    '[/urlc/urld/sc/filter]':
    -
        urlRegex: /utlnot/sc
        proxyPres: /evm
        enable: true
        insensitive: true

这是yml文件,该文件映射到RewriteBase类中,并插入到HashMap rewriteUrl中。假设要查找的键是“ / urla / urlb / sc”,因此我期望使用“ / urla / urlb / sc”作为键的HashMap,并且将仅包含将enable设置为true的记录的列表作为值。在实践中:

rewriteUrl:
    '[/urla/urlb/sc]':
    -
        urlRegex: /prea/sc
        proxyPres: /evm
        enable: true
        insensitive: true

目前我得到了正确的结果,但是我认为我的代码可以得到改进和提高。

1 个答案:

答案 0 :(得分:0)

这两个遍历(即一个映射条目和另一个条目中的值列表)几乎是不可避免的,但是您可以使其更具可读性,并避免按以下方式收集:

rewriteBaseList.keySet().removeIf(k -> !path.startsWith(k)); // updating the source map
rewriteBaseList.values().removeIf(v -> v.removeIf(r -> !r.isEnable()) && v.isEmpty());
相关问题