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

Sac*_*lla 5 java collections enums

我有一个枚举:

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

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

有更好的方法吗?

And*_*lko 5

A 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);
Run Code Online (Sandbox Code Playgroud)

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


如果列表很大(经过几次迭代可能会花费很多时间),我们可以对前一个代码片段进行一些优化,然后对列表进行一次迭代:

Set<String> values = Arrays.stream(PermissionsEnum.values())
                           .map(PermissionsEnum::getValue)
                           .collect(Collectors.toSet());

boolean result = list.stream().anyMatch(values::contains);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

Set<String> permissionsNames = Stream.of(PermissionsEnum.values())
                                     .map(PermissionsEnum::getName())
                                     .collect(Collectors.toSet());

boolean contains = !Collections.disjoint(list, permissionsNames);
Run Code Online (Sandbox Code Playgroud)

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

  • 赞成使用`Collections.disjoint`。但是,`Collections.disjoint` 是优化的,以防它接收到的集合之一是 `Set`。所以我只会将 `Collectors.toList()` 更改为 `Collectors.toSet()` 并且你会得到一些改进。 (2认同)