web-dev-qa-db-fra.com

Vérifier si la liste contient au moins un autre - enums

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. 

8
SachiDangalla

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)

8
Andrew Tobilko

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
5
Veselin Davidov

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)
1
Anton Balaniuc