我需要遍历所有枚举值,检查它们是否用于构造int(称为input),如果是,则将它们添加到Set(称为usefulEnums)中。我可以使用流API或遍历所有枚举来完成此任务。使用Arrays.stream()相对于遍历values()数组的传统方法有什么好处?

   enum TestEnum { VALUE1, VALUE2, VALUE3 };

   Set<TestEnum> usefulEnums = new HashSet<>();

   Arrays.stream(TestEnum.values())
            .filter(t -> (input & t.getValue()) != 0)
            .forEach(usefulEnums::add);

    for (TestEnum t : TestEnum.values()) {
        if ((input & t.getValue()) != 0) {
            usefulEnums.add(t);
        }
    }

最佳答案

对于此简短的操作,for loop将更快(纳秒级速度更快),但是对我来说,流操作是more verbose,它准确地告诉您这里正在做什么。就像对角阅读一样。

您也可以直接收集到HashSet

Arrays.stream(TestEnum.values())
        .filter(t -> (input & t.getValue()) != 0)
        .collect(Collectors.toCollection(HashSet::new));


像往常一样,Holger的宝贵输入使它变得更好:

EnumSet<TestEnum> filtered = EnumSet.allOf(TestEnum.class).stream()
            .filter(t -> (input & t.getValue()) != 0)
            .collect(Collectors.toCollection(() -> EnumSet.noneOf(TestEnum.class)));

10-05 23:09