Java 检查列表是否至少包含一个其他枚举

Java 检查列表是否至少包含一个其他枚举,java,enums,java-8,Java,Enums,Java 8,我有一个枚举: public enum PermissionsEnum { ABC("Abc"), XYZ("Xyz"), .... } 然后我有一个枚举列表。我想检查我的列表是否至少有一个枚举。我现在用迭代的方法检查它。我还知道有一种方法可以通过使用|检查list.contains(enum.ABC..)| list.contains(enum.XYZ)| |…… 有更好的方法吗 演示如何在目标列表是字符串列表时执行此操作,如果列表是另一个枚举列表,则

我有一个枚举:

public enum PermissionsEnum {
    ABC("Abc"),        
    XYZ("Xyz"),
    ....
}
然后我有一个枚举列表。我想检查我的列表是否至少有一个枚举。我现在用迭代的方法检查它。我还知道有一种方法可以通过使用
|
检查
list.contains(enum.ABC..)| list.contains(enum.XYZ)| |……

有更好的方法吗


演示如何在目标列表是字符串列表时执行此操作,如果列表是另一个枚举列表,则我希望获得匹配状态

您可以使用
Collections.disjoint()

使用要检查的枚举创建另一个列表,然后执行以下操作
Collections.disjoint(list,listOfEnumsToCheck)
。如果未找到任何元素,则返回true。如果为false,则至少存在一个元素

我想您甚至可以使用Enum.values(),因此它将变成:

// Using ! to show there is at least one value
if (!Collections.disjoint(list, PermissionsEnum.values()) { 
     doStuff 
} 

Collections.disjoint
如果两个指定集合没有共同元素,则返回
true
。如果返回
false
,则列表中至少有一个枚举

boolean contains = !Collections.disjoint(list, EnumSet.allOf(PermissionsEnum.class)));
流API方法可以是:

EnumSet<PermissionsEnum> set = EnumSet.allOf(PermissionsEnum.class);
boolean contains = list.stream().anyMatch(set::contains);
EnumSet=EnumSet.allOf(PermissionsEnum.class);
boolean contains=list.stream().anyMatch(set::contains);

(类似于迭代方法,但包括并行化)

如果可以使用
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)

可以在类型安全的枚举模式枚举中有一个静态列表作为主列表,主列表添加到枚举构造函数中。这样,您的主列表始终只包含每个枚举中的一个,您可以与之进行比较

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");
}
import java.util.ArrayList;
公开课{
公共静态最终ArrayList成员=新ArrayList();
私有最终字符串值;
公共字符串getValue(){return value;}
私有枚举数(字符串值){
这个。值=值;
加入(本条);
}
public static final EnumeratedEnum EnumOne=new EnumeratedEnum(“someValue”);
公共静态最终EnumerateNum EnumTwo=新EnumerateNum(“someValue2”);
公共静态最终枚举数EnumeTree=新枚举数(“someValue3”);
公共静态最终枚举数EnumeFour=新枚举数(“someValue4”);
公共静态最终枚举数EnumeFive=新枚举数(“someValue5”);
}

试试
!集合。不相交(列表1、列表2)
检查列表2是否包含来自列表2的元素“我想检查我的列表(枚举)是否至少有一个枚举”的确切含义是什么。也许我误解了,但是如果你有一个
列表
,那么不是所有元素都是这些枚举中的一个吗?除此之外,存储枚举集合的最佳方法是在
EnumSet
中,因为拥有相同的权限两次或两次以上是没有意义的。我将使用
asList(PermissionsEnum.values())
,而不是
EnumSet.allOf(PermissionsEnum.class)
,它返回一个
,其中包含O(1)查找和进一步操作不需要所有值的数组副本。此外,我插入
parallelStream()
时不会太快,因为列表不太可能太庞大,以至于并行执行这样一个简单的操作会有好处。
list.stream().anyMatch(EnumSet.allOf(PermissionsEnum.class)::contains)
作为
EnumSet更可取。contains
List更有效。contains
对于所有常见的
List
实现…@Holger,非常感谢您的评论,我不知道,它将更新我的答案。