列挙型があります:
_public enum PermissionsEnum {
ABC("Abc"),
XYZ("Xyz"),
....
}
_
そして、Enumsのリストがあります。リストに少なくとも1つの列挙型があるかどうかを確認したいと思います。私は現在、反復的なアプローチでそれをチェックしています。 _||
_チェックlist.contains(enum.ABC..) || list.contains(enum.XYZ) || ...
を使用してそれを行う方法があることも知っています。
それを行うより良い方法はありますか?
この質問 は、目的のリストが文字列のリストである場合の実行方法を示しています。リストが別の列挙型のリストである場合は、一致するステータスを取得します。
Collections.disjoint
は、指定された2つのコレクションに共通の要素がない場合、true
を返します。 false
を返す場合、リストには少なくとも1つの列挙型があります。
boolean contains = !Collections.disjoint(list, EnumSet.allOf(PermissionsEnum.class)));
ストリームAPIのアプローチは次のとおりです。
EnumSet<PermissionsEnum> set = EnumSet.allOf(PermissionsEnum.class);
boolean contains = list.stream().anyMatch(set::contains);
(反復アプローチに似ていますが、並列化が含まれています)
Collections.disjoint()
を使用できます。
チェックする列挙型を使用して別のリストを作成し、Collections.disjoint(list, listOfEnumsToCheck)
を実行します。要素が見つからない場合はtrueを返します。 falseの場合、少なくとも1つの要素が存在します。
Enum.values()を使用することもできるので、次のようになります。
// Using ! to show there is at least one value
if (!Collections.disjoint(list, PermissionsEnum.values()) {
doStuff
}
Java-8
を使用できる場合。
Arrays.stream(PermissionsEnum.values()).anyMatch(list::contains);
Enum#values()
この列挙型の定数を含む配列を返します。
したがって、それをストリームにラップし、リストに値が含まれているかどうかを確認するだけです。覚えておくべき重要なことは、
anyMatchは、結果を決定する必要がない場合、すべての要素の述語を評価しません。
つまり、述語を満たす要素が見つかるとすぐにtrueを返すかもしれません。
どうやら、EnumSet.contains
はList.contains
よりもはるかに効率的であるため、EnumSet.allOf(PermissionsEnum.class)::contains
を使用する方が効率的です。
list.stream().anyMatch(EnumSet.allOf(PermissionsEnum.class)::contains)
type Safe Enum Pattern enumに静的リストを置き、enumコンストラクターに追加されるマスターリストとして機能させることができます。これにより、マスターリストには常に各列挙型が1つだけ含まれ、それと比較できます。
import Java.util.ArrayList;
public class EnumeratedEnum {
public static final ArrayList<EnumeratedEnum> Members=new ArrayList<>();
private final String value;
public String getValue() {return value;}
private EnumeratedEnum(String value) {
this.value=value;
Members.add(this);
}
public static final EnumeratedEnum EnumOne=new EnumeratedEnum("someValue");
public static final EnumeratedEnum EnumTwo=new EnumeratedEnum("someValue2");
public static final EnumeratedEnum EnumThree=new EnumeratedEnum("someValue3");
public static final EnumeratedEnum EnumFour=new EnumeratedEnum("someValue4");
public static final EnumeratedEnum EnumFive=new EnumeratedEnum("someValue5");
}