У меня возникла небольшая проблема переписать мои два 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. Но почему-то, когда я использую потоки, он либо фильтрует все, либо ничего.




Ваш метод 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.
Если вы пытаетесь изменить исходную карту, вы можете использовать removeIf:
preSelectedValues.keySet().removeIf(
key -> parameters.stream()
.map(PersonModel::getName)
.anyMatch(key::startsWith)
);