首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将2 for s重构为java 8流

将2 for s重构为java 8流
EN

Stack Overflow用户
提问于 2018-11-02 07:57:29
回答 2查看 66关注 0票数 3

我面临一个小问题,要将我的两个for重写为java 8流。

代码语言:javascript
复制
// 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();
          }
     }
}

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

代码语言:javascript
复制
Map<String, Collection<String>> filteredParameters = preSelectedValues.keySet().stream()
    .filter(x -> isParameterValid(x, parameters))
    .collect(Collectors.toMap(k -> k, v -> preSelectedValues.get(v)));

isParameterValid方法:

代码语言:javascript
复制
private boolean isParameterValid(String parameterId, List<PersonModel> preSelectedValues) {
     return preSelectedValues.stream()
            .anyMatch(v -> !v.getName().startsWith(parameterId));
}

基本上,我要做的是过滤以"preSelectedValues“开头的"parameterId”映射。但不知怎么的,当我使用流时,它要么过滤所有的东西,要么什么也不过滤。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-02 08:03:29

您的isParameterValid方法没有与原始循环相同的逻辑,因为:

  1. 您将调用中的实例和参数切换到startsWith
  2. 使用anyMatch调用!v.getName().startsWith(parameterId)只告诉您List<PersonModel>的至少一个元素是否以parameterId开头。将条目保存在Map中的最初条件是,all List<PersonModel>元素不以parameterId开头(或者实际上相反- parameterId不以List<PersonModel>元素的任何名称开头)。

因此,我否定了返回从Map中删除条目的条件的方法。

代码语言:javascript
复制
private boolean isParameterInvalid(String parameterId, List<PersonModel> preSelectedValues) {
     return preSelectedValues.stream()
            .anyMatch(v -> parameterId.startsWith(v.getName()));
}

然后流管道可以如下所示:

代码语言:javascript
复制
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实现同样的目标。

票数 3
EN

Stack Overflow用户

发布于 2018-11-02 08:06:07

如果您试图修改原始地图,可以使用removeIf

代码语言:javascript
复制
preSelectedValues.keySet().removeIf(
    key -> parameters.stream()
            .map(PersonModel::getName)
            .anyMatch(key::startsWith)
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53114680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档