重构两个用于公司为Java 8流

MICU:

我现在面临一个小问题,以我的两个对的改写成Java 8流。

// This is a method parameter
Map<String, Collection<String>> preSelectedValues;

List<PersonModel> parameters = parameterSearchService.getParameterNames();

for(Iterator<Map.Entry<String, Collection<String>>> it = preSelectedValues.entrySet().iterator(); it.hasNext();) {
     Map.Entry<String, Collection<String>> entry = it.next();
     for(int i = 0; i < parameters.size(); i++) {
          if (entry.getKey().startsWith(parameters.get(i).getName())) {
               it.remove();
          }
     }
}

我试过以下流具有相同的行为之前:

Map<String, Collection<String>> filteredParameters = preSelectedValues.keySet().stream()
    .filter(x -> isParameterValid(x, parameters))
    .collect(Collectors.toMap(k -> k, v -> preSelectedValues.get(v)));

isParameterValid 方法:

private boolean isParameterValid(String parameterId, List<PersonModel> preSelectedValues) {
     return preSelectedValues.stream()
            .anyMatch(v -> !v.getName().startsWith(parameterId));
}

基本上我试图做的是过滤器“preSelectedValues”地图与“参数标识”开始。但不知何故,当我使用的是流或者它过滤什么都不要。

他们是:

你的isParameterValid方法不具有相同的逻辑原循环中,因为:

  1. 你交换的呼叫实例和论证startsWith
  2. 调用anyMatch一个!v.getName().startsWith(parameterId)只告诉您是否至少一个元素List<PersonModel>不会启动parameterId您原来保持在进入条件Map是,所有的元素List<PersonModel>不启动parameterId(或实际上,周围的其他方法- parameterId不与任何元素的名称开始List<PersonModel>)。

因此,我否定了方法返回的条件除去从一个条目Map

private boolean isParameterInvalid(String parameterId, List<PersonModel> preSelectedValues) {
     return preSelectedValues.stream()
            .anyMatch(v -> parameterId.startsWith(v.getName()));
}

然后流管道可以是这样的:

Map<String, Collection<String>> filteredParameters = preSelectedValues.entrySet().stream()
    .filter(x -> !isParameterInvalid(x.getKey(), parameters))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

顺便说一句,因为你原来的循环突变原Map,可以实现与同removeIf

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章