我有一个枚举:
public enum PermissionsEnum {
ABC("Abc"),
XYZ("Xyz"),
....
}
然后我有一个字符串列表。我想检查一下我的列表中是否至少有一个枚举。我目前通过迭代方法检查它。我也知道有一种方法可以使用||
检查list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
来实现。
有更好的方法吗?
答案 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);