我有一个由字符串作为键和对象列表作为值的哈希图。我需要从此列表中提取具有特定字符串作为键的记录。同样在每条记录包含的值列表中,我需要将特定属性设置为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
目前我得到了正确的结果,但是我认为我的代码可以得到改进和提高。
答案 0 :(得分:0)
这两个遍历(即一个映射条目和另一个条目中的值列表)几乎是不可避免的,但是您可以使其更具可读性,并避免按以下方式收集:
rewriteBaseList.keySet().removeIf(k -> !path.startsWith(k)); // updating the source map
rewriteBaseList.values().removeIf(v -> v.removeIf(r -> !r.isEnable()) && v.isEmpty());