Estoy frente a un pequeño problema para volver a escribir mis dos para la de en java 8 corrientes.
// 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();
}
}
}
He intentado siguiente transmisiones para que tengan el mismo comportamiento que antes:
Map<String, Collection<String>> filteredParameters = preSelectedValues.keySet().stream()
.filter(x -> isParameterValid(x, parameters))
.collect(Collectors.toMap(k -> k, v -> preSelectedValues.get(v)));
isParameterValid
método:
private boolean isParameterValid(String parameterId, List<PersonModel> preSelectedValues) {
return preSelectedValues.stream()
.anyMatch(v -> !v.getName().startsWith(parameterId));
}
Básicamente lo que estoy tratando de hacer es el filtro del mapa "preSelectedValues", que comienza con "parameterId". Pero de alguna manera cuando estoy usando corrientes o bien se filtra a todo o nada.
Su isParameterValid
método no tiene la misma lógica que los lazos originales, ya que:
- Cambió la instancia y el argumento en la llamada a
startsWith
. - Llamando
anyMatch
con una!v.getName().startsWith(parameterId)
única le indica si al menos un elemento de laList<PersonModel>
no comienza conparameterId
. Su condición original para mantener la entrada en laMap
era que todos los elementos deList<PersonModel>
no empiezan conparameterId
(o en realidad, al revés -parameterId
no se inicia con cualquiera de los nombres de los elementos deList<PersonModel>
).
Por lo tanto negaba el método para devolver la condición para la eliminación de una entrada de la Map
:
private boolean isParameterInvalid(String parameterId, List<PersonModel> preSelectedValues) {
return preSelectedValues.stream()
.anyMatch(v -> parameterId.startsWith(v.getName()));
}
Y a continuación, la tubería corriente puede tener este aspecto:
Map<String, Collection<String>> filteredParameters = preSelectedValues.entrySet().stream()
.filter(x -> !isParameterInvalid(x.getKey(), parameters))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Por cierto, ya que sus bucles originales mutan el original Map
, se puede lograr lo mismo con removeIf
.