public Player(String name,Strategy strategy) { … } public Hand getNextHand() { return strategy.getHand(); } } プレイヤークラス public interface Strategy{ Hand getHand(); } public enum Hand{ ROCK,SCISSORS,PAPER } Strategyインタフェースの実装 5
•メソッドが1文の場合、{}とreturnも省略可能 Player guPlayer = new Player("CPU1", new Strategy() { @Override public Hand getHand() { return Hand.ROCK; } }); 匿名クラスを利用する従来のコード(再掲) Player guPlayer = new Player("CPU1", () -> Hand.ROCK); ラムダ式を利用するコード(再掲) 7
public static Hand getRock() {return Hand.ROCK;} public Hoge(Hand hand){this.hand = hand;} private Hand hand; public Hand getHand() {return hand;} } 10 // クラスメソッドのメソッド参照 Player guPlayer = new Player("CPU1", Hoge::getRock); // インスタンスのメソッド参照 Hoge hoge = new Hoge(Hand.ROCK); Player guPlayer2 = new Player("CPU2", hoge::getHand); メソッド参照を利用するコード
} public class Piyo{ public int operate(Operator op){ return op.operate(“fuga”); } } String#lengthのシグネチャは int length()。 int operate(String s) とは引数が異なるが、第一引数の型と一致す るので渡せる。s.length() と同じ意味になる メソッド参照を渡すインタフェース Piyo piyo = new Piyo(); // ラムダ式の例 piyo.operate( (s) ->s.length()); // 異なるシグネチャのメソッド参照の例 piyo.operate( String::length ); メソッド参照を利用するコード