読者です 読者をやめる 読者になる 読者になる

白猫のメモ帳

JavaとかJavaScriptとかHTMLとか機械学習とか。

enum+ラムダ=おしゃれ

Java

こんばんは。

オリンピックが始まりましたね。
夜更かししすぎないように気をつけねば。


ところで、enumって便利ですよね。
使いますよね。


数が限られているようなときに便利です。
Java7でStringがswitchに対応したので、switchに使えるというメリットはちょっと弱くなりました。

public enum Color {
    RED, GREEN, BRUE
}


定数みたいに使えるのもgoodです。

public enum Operator {
    
    ADD("+")
    
    , SUBTRACT("-")
    
    , MULTIPLY("*")
    
    , DIVIDE("/")
    
    ;
    
    private final String mark;
    
    private Operator(String mark) {
        this.mark = mark;
    }
    
    public String getMark() {
        return this.mark;
    }
}


ところでこれ、メソッドが生やせるんですよ。
Strategyパターンとかにいいですよね。

public enum Operator {
    
    ADD {
        @Override
        public int calc(int x, int y) {
            return x + y;
        }
    }
    
    , SUBTRACT {
        @Override
        public int calc(int x, int y) {
            return x - y;
        }
    }
    
    , MULTIPLY {
        @Override
        public int calc(int x, int y) {
            return x * y;
        }
    }
    
    , DIVIDE {
        @Override
        public int calc(int x, int y) {
            return x / y;
        }
    }
    
    ;
    
    public abstract int calc(int x, int y);
}


でもなんか無駄に長いんですよね。
ラムダで書くと短くておしゃれでいいよね。

public enum Operator {
    
    ADD((x, y) -> x + y)
    
    , SUBTRACT((x, y) -> x - y)
    
    , MULTIPLY((x, y) -> x * y)
    
    , DIVIDE((x, y) -> x / y)
    
    ;
    
    private final BinaryOperator<Integer> func;
    
    private Operator(BinaryOperator<Integer> func) {
        this.func = func;
    }
    
    public int calc(int x, int y) {
        return this.func.apply(x, y);
    }
}

っていうおはなしです。