我需要遍历所有枚举值,检查它们是否用于构造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)));