检查列表是否包含至少一个枚举的最佳方法

时间:2018-04-10 06:58:12

标签: java collections enums

我有一个枚举:

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

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

List<String>永远不会包含PermissionsEnum值。条件list.contains(enum.ABC) || list.contains(enum.XYZ)不起作用。

相反,您可以将PermissionsEnum.values()映射到Stream<String>并在其上调用Stream#anyMatch

boolean result = Arrays.stream(PermissionsEnum.values())
                       .map(PermissionsEnum::getValue)
                       .anyMatch(list::contains);

*我假设getValue方法可以访问构造函数参数。

如果列表很大(对它进行一些迭代可能需要花费很多时间),我们可以稍微优化前一个片段并迭代列表一次:

Set<String> values = Arrays.stream(PermissionsEnum.values())
                            .map(PermissionsEnum::getValue)
                            .collect(Collectors.toSet());
boolean result = list.stream().anyMatch(values::contains);

答案 1 :(得分:3)

您可以使用for循环以迭代方式轻松完成。

boolean contains = false;
for (PermissionsEnum permission : PermissionsEnum.values()) {
    if (list.contains(permission.getName())) {
        contains = true;
        break;
    }
}

或者您可以像这样使用Collections.disjoint()

Set<String> permissionsNames = Stream.of(PermissionsEnum.values())
                               .map(PermissionsEnum::getName())
                               .collect(Collectors.toSet());
boolean contains = !Collections.disjoint(list, permissionsNames);

PS:getName()必须检索构造函数值。

答案 2 :(得分:0)

另一种方法是使用java.util.List.containsAll(Collection<?> c),如果此列表包含指定集合的​​所有元素,则返回true。

List permissionEnumList = Arrays.asList(PermissionsEnum.values());
List tobeCheckedEnumList= Arrays.asList(PermissionsEnum.ABC);
boolean result= permissionEnumList.containsAll(tobeCheckedEnumList);