gpt4 book ai didi

java - 将嵌套的 foreach 重构为 Java 8 流

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

假设内部循环满足条件,我有两个循环遍历以填充最终列表的列表。

private List<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
List<Enum> enumList = new ArrayList<>();

for (Bean.Var var : vars) {
String typeWithoutTypeIdentifierPrefix = var.getType().substring(1,var.getType().length());
for (Enum enumVal : enums) {
if (typeWithoutTypeIdentifierPrefix.equals(enumVal.getName())) {
if (!enumList.contains(enumVal)) {
enumList.add(enumVal);
}
}
}
}

return enumList;
}

我重构了代码以使用最新的 Java 8 流式 api,我想出了这个:

vars.stream().forEach(
var -> {
String typeWithoutPrimitiveIdentifier = var.getType().substring(1,var.getType().length());

enums.stream()
.filter(enumVal -> typeWithoutPrimitiveIdentifier(enumVal.getName()))
.forEach(enumVal -> {

if (!enumList.contains(enumVal)) {
enumList.add(enumVal);
}
});
}
);

我怎样才能进一步删除嵌套的 foreach() 方法?

最佳答案

通过使用 stream().forEach(..) 调用 forEach 中的 add 的问题(所以你改变了external enumList instance)是如果有人并行转换流并且集合不是线程安全的,你很容易遇到并发问题。

相反,您应该支持适合可变归约的 collect 方法:

private Set<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
return vars.stream()
.map(var -> var.getType().substring(1))
.map(v -> enums.stream().filter(e -> v.equals(e.getName())).findAny())
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toSet());
}

您可能还想预先构建映射 String -> Enum 以避免多重过滤。

private Set<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) {
Map<String, Enum> enumsName = enums.stream().collect(toMap(Enum::getName, e -> e, (e1, e2) -> e1));
return vars.stream()
.map(var -> var.getType().substring(1))
.map(enumsName::get)
.filter(Objects::nonNull)
.collect(toSet());
}

如果你真的想返回一个List,你可以看看Collectors.collectingAndThen

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

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