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

Sac*_*lla 10 java enums java-8

我有一个枚举:

public enum PermissionsEnum {
    ABC("Abc"),        
    XYZ("Xyz"),
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法呢?

此问题显示如果目标列表是字符串列表如何执行操作,如果列表是另一个枚举列表,我想获得匹配状态.

And*_*lko 12

Collections.disjointtrue如果两个指定的集合没有共同的元素,则返回 如果它返回false,那么您的列表至少有一个枚举.

boolean contains = !Collections.disjoint(list, EnumSet.allOf(PermissionsEnum.class)));
Run Code Online (Sandbox Code Playgroud)

Stream API方法可以是:

EnumSet<PermissionsEnum> set = EnumSet.allOf(PermissionsEnum.class);
boolean contains = list.stream().anyMatch(set::contains);
Run Code Online (Sandbox Code Playgroud)

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

  • 而不是`asList(PermissionsEnum.values())`,我使用`EnumSet.allOf(PermissionsEnum.class)`返回一个具有O(1)查找的`Set`,并且不需要所有的数组副本值.此外,我不会那么快地插入`parallelStream()`,因为列表是如此庞大以至于并行执行这样一个简单的操作有一个好处. (5认同)

Ves*_*dov 6

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

我猜你甚至可以使用Enum.values(),所以它会变成:

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