我面临一个小问题,要将我的两个for重写为java 8流。
// 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));
}基本上,我要做的是过滤以"preSelectedValues“开头的"parameterId”映射。但不知怎么的,当我使用流时,它要么过滤所有的东西,要么什么也不过滤。
发布于 2018-11-02 08:03:29
您的isParameterValid方法没有与原始循环相同的逻辑,因为:
startsWith。anyMatch调用!v.getName().startsWith(parameterId)只告诉您List<PersonModel>的至少一个元素是否以parameterId开头。将条目保存在Map中的最初条件是,all 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实现同样的目标。
发布于 2018-11-02 08:06:07
如果您试图修改原始地图,可以使用removeIf
preSelectedValues.keySet().removeIf(
key -> parameters.stream()
.map(PersonModel::getName)
.anyMatch(key::startsWith)
);https://stackoverflow.com/questions/53114680
复制相似问题