gpt4 book ai didi

java - 将两个 for 重构为 java 8 流

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:00:48 25 4
gpt4 key购买 nike

我遇到了一个小问题,需要将我的两个 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));
}

基本上我要做的是过滤以“parameterId”开头的“preSelectedValues”映射。但不知何故,当我使用流时,它要么过滤所有内容,要么什么都不过滤。

最佳答案

你的 isParameterValid方法没有与原始循环相同的逻辑,因为:

  1. 您在对 startsWith 的调用中切换了实例和参数.
  2. 调用 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 达到同样的效果.

关于java - 将两个 for 重构为 java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com