はじめに
Javaでenum
を利用する際、メンバ変数を宣言することが可能ですが、
指定した文字列や値、インスタンスがenum内に含まれているか? という
- Collectionクラスのcontainsメソッド
- MapクラスのcontainsKey/containsValueメソッド
のようなメソッドに関しては自前で実装する必要があります。
実装自体は難しくないですが、調べても意外と出てこなかったため備忘録として残します。
今回利用するenum
enum
public static enum Department {
SALES("1","営業部"),
PERSONNAL("2","人事部"),
DEVELOPMENT("3","開発部");
private final String departmentCode;
private final String departmentName;
Department(String departmentCode, String departmentName){
this.departmentCode = departmentCode;
this.departmentName = departmentName;
}
public String getDepartmentCode() {
return departmentCode;
}
public String getDepartmentName() {
return departmentName;
}
}
やりたいことのイメージ
Map型変数で利用できるcontainsKey
メソッドやcontainsValue
メソッドをenumで再現したい
public static final Map<String, String> DEPARTMENT_MAP = new HashMap<>();
static {
DEPARTMENT_MAP.put("1","営業部");
DEPARTMENT_MAP.put("2","人事部");
DEPARTMENT_MAP.put("3","開発部");
}
public static void main(String[] args) {
System.out.println("----[HashMap]containsKeyメソッド確認!!----");
System.out.println("1 は" + (DEPARTMENT_MAP.containsKey("1") ? "含まれている" : "含まれていない"));
System.out.println("4 は" + (DEPARTMENT_MAP.containsKey("4") ? "含まれている" : "含まれていない"));
System.out.println("----[HashMap]containsValueメソッド確認!!----");
System.out.println("営業部 は" + (DEPARTMENT_MAP.containsValue("営業部") ? "含まれている" : "含まれていない"));
System.out.println("マーケティング部 は" + (DEPARTMENT_MAP.containsValue("マーケティング部") ? "含まれている" : "含まれていない"));
}
実装内容
public static boolean containsKey(String target) {
return Arrays.stream(Department.values()).anyMatch(r -> r.getDepartmentCode().equals(target));
}
ざっくりとした説明は以下
-
values
メソッドでenumを配列で返却 -
Arrays.stream
メソッドで配列をStreamに変換 -
anyMatch
メソッドで引数の値に一致するメンバ変数があればtrueを返却
※containsValueの説明に関しては、メソッド内のつくりはほぼ同じ(参照するメンバ変数が異なるのみ)のため、割愛
実行例
public class Main {
public static enum Department {
SALES("1","営業部"),
PERSONNAL("2","人事部"),
DEVELOPMENT("3","開発部");
private final String departmentCode;
private final String departmentName;
Department(String key, String value){
this.departmentCode = key;
this.departmentName = value;
}
public String getDepartmentCode() {
return departmentCode;
}
public String getDepartmentName() {
return departmentName;
}
public static boolean containsKey(String target) {
return Arrays.stream(Department.values()).anyMatch(r -> r.getDepartmentCode().equals(target));
}
public static boolean containsValue(String target) {
return Arrays.stream(Department.values()).anyMatch(r -> r.getDepartmentName().equals(target));
}
}
public static void main(String[] args) {
System.out.println("----[enum]containsKeyメソッド確認!!----");
System.out.println("1 は" + (Department.containsKey("1") ? "含まれている" : "含まれていない"));
System.out.println("4 は" + (Department.containsKey("4") ? "含まれている" : "含まれていない"));
System.out.println("----[enum]containsValueメソッド確認!!----");
System.out.println("営業部 は" + (Department.containsValue("営業部") ? "含まれている" : "含まれていない"));
System.out.println("マーケティング部 は" + (Department.containsValue("マーケティング部") ? "含まれている" : "含まれていない"));
}
}
実行結果
----[enum]containsKeyメソッド確認!!----
1 は含まれている
4 は含まれていない
----[enum]containsValueメソッド確認!!----
営業部 は含まれている
マーケティング部 は含まれていない