[英]Check if list contains at least one of another - enums
我有一个枚举:
public enum PermissionsEnum {
ABC("Abc"),
XYZ("Xyz"),
....
}
然后我有一个Enums列表。 我想检查一下我的列表中是否至少有一个枚举。 我目前通过迭代方法检查它。 我也知道有一种方法可以通过使用||
检查list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
有没有更好的方法呢?
如果两个指定的集合没有共同的元素,则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);
(类似于迭代方法,但包含并行化)
您可以使用Collections.disjoint()
。 使用要检查的枚举创建另一个List,然后执行Collections.disjoint(list, listOfEnumsToCheck)
- 如果未找到任何元素,则返回true。 如果为假,则至少存在一个元素。
我猜你甚至可以使用Enum.values(),所以它会变成:
if(!Collections.disjoint(list, PermissionsEnum.values()) { doStuff } //Using ! to show there is at least one value
如果你可以使用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)
您可以在Type Safe Enum Pattern枚举中使用静态列表作为主列表,该列表将添加到枚举构造函数中。 这样你的主列表总是包含每个枚举中的一个,你可以与之比较。
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.