LoginSignup
5
0

More than 1 year has passed since last update.

【Java】enumでcontainsメソッドっぽく指定した値が存在するか判定する

Posted at

はじめに

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メソッド確認!!----
営業部 は含まれている
マーケティング部 は含まれていない
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0