第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(); }
■ 実行結果