Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为'重构两个;转换为Java8流_Java_Java 8_Java Stream - Fatal编程技术网

为'重构两个;转换为Java8流

为'重构两个;转换为Java8流,java,java-8,java-stream,Java,Java 8,Java Stream,我面临一个小问题,要将我的两个for重写为Java8流 // This is a method parameter Map<String, Collection<String>> preSelectedValues; List<PersonModel> parameters = parameterSearchService.getParameterNames(); for(Iterator<Map.Entry<String, Collectio

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

// 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();
          }
     }
}

基本上,我要做的是过滤以“parameterId”开头的“preSelectedValues”映射。但不知何故,当我使用streams时,它要么过滤所有内容,要么不过滤任何内容。

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

  • 您已将调用中的实例和参数切换到
    startsWith
  • 调用
    anyMatch
    !v、 getName().startsWith(parameterId)
    仅告诉您
    列表中的至少一个元素是否以
    parameterId
    开头。在
    映射中保留条目的原始条件是所有
    列表中的元素都不以
    参数ID开头(或者实际上,反过来-
    参数ID
    不以
    列表中任何元素的名称开头)
  • 因此,我否定了返回从
    映射中删除条目的条件的方法:

    private boolean isParameterInvalid(String parameterId, List<PersonModel> preSelectedValues) {
         return preSelectedValues.stream()
                .anyMatch(v -> parameterId.startsWith(v.getName()));
    }
    
    private boolean isParameterInvalid(字符串参数化,列出预选值){
    返回预选值。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 filteredParameters=预选值。entrySet().stream()
    .filter(x->!isParameterInvalid(x.getKey(),参数))
    .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
    

    顺便说一句,由于原始循环会改变原始的
    映射
    ,因此如果您试图修改原始映射,可以使用
    removeIf
    实现同样的效果:

    preSelectedValues.keySet().removeIf(
        key -> parameters.stream()
                .map(PersonModel::getName)
                .anyMatch(key::startsWith)
    );
    
    Map<String, Collection<String>> filteredParameters = preSelectedValues.entrySet().stream()
        .filter(x -> !isParameterInvalid(x.getKey(), parameters))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    
    preSelectedValues.keySet().removeIf(
        key -> parameters.stream()
                .map(PersonModel::getName)
                .anyMatch(key::startsWith)
    );