J'ai un enum:
public enum PermissionsEnum {
ABC("Abc"),
XYZ("Xyz"),
....
}
Et puis j'ai une liste de Enums . Je veux vérifier si ma liste a au moins une des énumérations. Je le vérifie actuellement par une approche itérative. Je sais aussi qu'il existe un moyen de le faire en utilisant ||
vérifiant list.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
.
Y a-t-il une meilleure façon de le faire?
Cette question montre comment procéder si la liste d'objectifs est une liste de chaînes, je souhaite obtenir le statut correspondant si la liste est une autre liste d'énums.
Collections.disjoint
renvoie true
si les deux collections spécifiées n'ont aucun élément en commun. S'il renvoie false
, votre liste contient au moins un des énumérations.
boolean contains = !Collections.disjoint(list, EnumSet.allOf(PermissionsEnum.class)));
Une approche API Stream pourrait être:
EnumSet<PermissionsEnum> set = EnumSet.allOf(PermissionsEnum.class);
boolean contains = list.stream().anyMatch(set::contains);
(similaire à une approche itérative mais avec une parallélisation incluse)
Vous pouvez utiliser Collections.disjoint()
. Créez une autre liste avec les énumérations que vous souhaitez vérifier, puis exécutez Collections.disjoint(list, listOfEnumsToCheck)
- elle renvoie true si aucun élément n'est trouvé. Si c'est faux, au moins un élément est présent.
Je suppose que vous pouvez même utiliser Enum.values () pour qu'il devienne:
if(!Collections.disjoint(list, PermissionsEnum.values()) { doStuff } //Using ! to show there is at least one value
Si vous pouvez utiliser Java-8
.
Arrays.stream(PermissionsEnum.values()).anyMatch(list::contains);
Enum#values()
Retourne un tableau contenant les constantes de ce type enum.
Il suffit donc de l'envelopper dans un flux et de vérifier si la liste contient des valeurs. La chose importante à retenir est que
anyMatch n'évalue pas le prédicat sur tous les éléments s'il n'est pas nécessaire pour déterminer le résultat.
En d'autres termes, il peut retourner vrai dès que l'élément qui satisfait le prédicat est trouvé.
Apparemment, la méthode la plus efficace consiste à utiliser EnumSet.allOf(PermissionsEnum.class)::contains
car EnumSet.contains
est beaucoup plus efficace que List.contains
:
list.stream().anyMatch(EnumSet.allOf(PermissionsEnum.class)::contains)