Javaの8ストリームにのためのリファクタリング2

MICU:

私は、Java 8つの流れにのための私の2を書き換える小さな問題に直面しています。

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

基本的に私がやろうとしていることは、フィルタは「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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202523&siteId=1