检查列表是否至少包含另一个 - 枚举

时间:2018-04-11 10:16:45

标签: java enums java-8

我有一个枚举:

public enum PermissionsEnum {
    ABC("Abc"),        
    XYZ("Xyz"),
    ....
}

然后我有枚举的列表。我想检查一下我的列表中是否至少有一个枚举。我目前通过迭代方法检查它。我也知道有一种方法可以使用||检查list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...来实现。

有更好的方法吗?

This question显示如果目标列表是字符串列表,如果列表是另一个枚举列表,我想获得匹配状态。

4 个答案:

答案 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.containsList.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");
}