我现在面临一个小问题,以我的两个对的改写成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”地图与“参数标识”开始。但不知何故,当我使用的是流或者它过滤什么都不要。
你的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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句