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 之前的匿名内部类)。当您添加所有样板时,您可以看到 Color 不需要是 aFunctionalInterface或实现Function- 在较长的形式中,您会将对该方法的调用包装在 aFunction中。

简化对 lambda 的调用给出

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 回答