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) || ...。
有更好的方法吗?
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()必须检索构造函数值。