3

私は現在、Venkat Subramaniam による Java での関数型プログラミングを読んでいますが、これまでのところ素晴らしい読み物です。

ただし、特定の例があり、混乱を引き起こしています。以下のコード例には、 というメソッドがありsetFilters(final Function<Color,Color>... filters)ます。

これは、Function インターフェイスを実装するリストを想定しています。コードでは、メソッド参照を使用して setFilters が呼び出されます ... camera.setFilters(Color::lighter, Color::darker);.

Color クラスは Function インターフェイスを実装しておらず、R apply(T t);署名に一致するメソッドも持っていないため、これは混乱を招きます。

ここで明らかなことを見逃しましたか?Color::darker誰かが期待するパラメータにetcを渡す方法を説明してもらえますかFunction<Color,Color>

完全なコード例は次のとおりです。

package designing.fpij;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.stream.Stream;
import java.util.function.Function;
import java.awt.Color;
import java.util.function.Consumer;

@SuppressWarnings("unchecked")
public class Camera {  
  private Function<Color, Color> filter;


  public Color capture(final Color inputColor) {
    final Color processedColor = filter.apply(inputColor);
    return processedColor;
  }

  public void setFilters(final Function<Color, Color>... filters) {
    filter =
            Stream.of(filters).
                    reduce((after, before) -> filter.compose(before)).orElse(color -> color);
  }
  public Camera() {
    setFilters();
  }

  public static void main(final String[] args) {
    final Camera camera = new Camera();
    final Consumer<String> printCaptured = (filterInfo) ->
            System.out.println(String.format("with %s: %s", filterInfo, camera.capture(new Color(200, 100, 150))));

    System.out.println("//" + "START:NOFILTER_OUTPUT");
    printCaptured.accept("no filter");
    System.out.println("//" + "END:NOFILTER_OUTPUT");

    System.out.println("//" + "START:BOTH_OUTPUT");
    camera.setFilters(Color::brighter, Color::darker);
    printCaptured.accept("brighter & darker filter");
    System.out.println("//" + "END:BOTH_OUTPUT");

  }

}
4

2 に答える 2

5

通話中

camera.setFilters(Color::darker);

と同等です

setFilters(new Function<Color, Color>() {
    @Override
    public Color apply(Color color) {
        return color.darker();
    }
});

(Java 8 より前の匿名内部クラスを使用している場合)。FunctionalInterfaceColor が である必要も実装する必要もないボイラープレートをすべて追加するFunctionと、このメソッドへの呼び出しを でラップする長い形式であることがわかりますFunction

この呼び出しをラムダに単純化すると、

setFilters((Function<Color, Color>) color -> color.darker());

またはさらに短い:

setFilters(color -> color.darker());

これは最終的にメソッド参照に単純化できます。

setFilters(Color::darker);
于 2015-08-11T09:37:35.057 に答える
0

Java AWT Color クラス ( docs ) にはメソッド brighter()darker()があるため、呼び出しは実際にこれらの関数を渡します。

于 2015-08-11T09:24:46.560 に答える