我有一个枚举:
public enum PermissionsEnum {
ABC("Abc"),
XYZ("Xyz"),
....
}
然后我有枚举的列表。我想检查一下我的列表中是否至少有一个枚举。我目前通过迭代方法检查它。我也知道有一种方法可以使用||
检查list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
来实现。
有更好的方法吗?
This question显示如果目标列表是字符串列表,如果列表是另一个枚举列表,我想获得匹配状态。
答案 0 :(得分:9)
Collections.disjoint
返回true
。如果它返回false
,则您的列表至少包含一个枚举。
boolean contains = !Collections.disjoint(list, EnumSet.allOf(PermissionsEnum.class)));
Stream API方法可以是:
EnumSet<PermissionsEnum> set = EnumSet.allOf(PermissionsEnum.class);
boolean contains = list.stream().anyMatch(set::contains);
(类似于迭代方法,但包括并行化)
答案 1 :(得分:5)
您可以使用Collections.disjoint()
。使用要检查的枚举创建另一个列表,然后执行Collections.disjoint(list, listOfEnumsToCheck)
- 如果未找到任何元素,则返回true。如果为假,则至少存在一个元素。
我猜你甚至可以使用Enum.values(),所以它会变成:
if(!Collections.disjoint(list, PermissionsEnum.values()) { doStuff } //Using ! to show there is at least one value
答案 2 :(得分:1)
如果您可以使用java-8
。
Arrays.stream(PermissionsEnum.values()).anyMatch(list::contains);
Enum#values()
返回一个包含此枚举类型常量的数组。
所以我们只需要将它包装成一个流并检查列表是否包含任何值。要记住的重要一点是
如果没有必要,anyMatch不会评估所有元素的谓词 确定结果。
换句话说,只要找到满足谓词的元素,它就可以返回true。
显然,更有效的方法是使用EnumSet.allOf(PermissionsEnum.class)::contains
,因为EnumSet.contains
比List.contains
更有效:
list.stream().anyMatch(EnumSet.allOf(PermissionsEnum.class)::contains)
答案 3 :(得分:0)
在类型安全的枚举模式枚举中可以有一个静态列表作为主列表,该列表已添加到枚举构造函数中。这样,您的主列表将始终只包含每个枚举之一,您可以对此进行比较。
import java.util.ArrayList;
public class EnumeratedEnum {
public static final ArrayList<EnumeratedEnum> Members=new ArrayList<>();
private final String value;
public String getValue() {return value;}
private EnumeratedEnum(String value) {
this.value=value;
Members.add(this);
}
public static final EnumeratedEnum EnumOne=new EnumeratedEnum("someValue");
public static final EnumeratedEnum EnumTwo=new EnumeratedEnum("someValue2");
public static final EnumeratedEnum EnumThree=new EnumeratedEnum("someValue3");
public static final EnumeratedEnum EnumFour=new EnumeratedEnum("someValue4");
public static final EnumeratedEnum EnumFive=new EnumeratedEnum("someValue5");
}