为'重构两个;转换为Java8流
我面临一个小问题,要将我的两个for重写为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
// 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)
);