CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第3章 ラムダ式を使ったプログラミング : 問題 11 : 色変換の合成

問題

二つのColorTransformerを合成するメソッドを実装せよ

さらにUnaryOperator<Color>から、X座標とY座標を無視するColorTransformerを生成するメソッドを実装せよ

解答

この本には “static メソッド” と指定してあったが、私が最もふさわしいと思う場所、即ちColorTransformerのメンバーに実装する。

ColorTransformer

@FunctionalInterface
interface ColorTransformer {
    Color apply(int x, int y, Color colorAtXY);

    /**
     * 色変換の合成
     *
     * @param before  先に適用する色変換
     * @return        合成した色変換
     */
    default ColorTransformer compose(ColorTransformer before) {
        return (x, y, c) -> apply(x, y, before.apply(x, y, c));
    }

    /**
     * 色のみの変換から座標を考慮しない色変換を生成
     *
     * @param op      色のみの変換
     * @return        座標を考慮しない色変換
     */
    static ColorTransformer onlyColor(UnaryOperator<Color> op) {
        return (x, y, c) -> op.apply(c);
    }
}

さらに問題

上記のメソッドを使って “明るくなった画像に灰色の枠を追加する” 色変換を生成せよ

解答

■ transformメソッドの呼び出し

public void start(Stage stage) throws Exception {
    Image image = new Image("queen-mary.png");
    int width = (int)image.getWidth();
    int height = (int)image.getHeight();
    Image image2;
    ColorTransformer grayFrame =
        (x, y, c) ->
        x < 10 || y < 10 || x >= width - 10 || y >= height - 10 ? Color.GRAY : c;
    image2 = transform(image, grayFrame.compose(ColorTransformer.onlyColor(Color::brighter)));
    stage.setScene(new Scene(new HBox(new ImageView(image), new ImageView(image2))));
    stage.show();
}

■ 実行結果 f:id:ClosedUnBounded:20150611155005p:plain