繁体   English   中英

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

[英]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.containsList.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM