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
方法は、以来、元のループと同じロジックを持っていません。
- あなたはへの呼び出しでインスタンスおよび引数を切り替えます
startsWith
。 - 呼び出し
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
。