当前位置:  开发笔记 > 编程语言 > 正文

将嵌套的foreach重构为Java 8流

如何解决《将嵌套的foreach重构为Java8流》经验,为你挑选了1个好方法。

我有两个列表,我循环填充最终列表,因为内部循环满足条件.

private List getEnumFromType(List vars, List enums) {
    List 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()方法呢?



1> Alexis C...:

通过使用内部stream().forEach(..)调用(所以你改变外部实例)的问题是,如果有人并行转换流并且集合不是线程安全的,那么你可以很容易地运行并发问题.addforEachenumList

相反,你应该赞成适合可变减少的收集方法:

private Set getEnumFromType(List vars, List 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 getEnumFromType(List vars, List enums) {
    Map 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.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有