私は現在、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");
}
}