首页 > 解决方案 > 使用 lambda 表达式不可能重复的功能接口解析

问题描述

具有相同功能签名的两个接口。

以 SimpleStepBuilder.processor 为例。

相同功能类型的两个重载。

传递 lambda 表达式似乎是不可能的。

对或错?

 public SimpleStepBuilder<I, O> processor(ItemProcessor<? super I, ? extends O> processor) {
    this.processor = processor;
    return this;
}

public SimpleStepBuilder<I, O> processor(Function<? super I, ? extends O> function) {
    this.itemProcessorFunction = function;
    return this;
}

public interface ItemProcessor<I, O> {
    @Nullable
    O process(I item) throws Exception;
}

标签: javajava-8

解决方案


是的,传递任何 lambdaa -> a.toB()都会导致模棱两可的调用。

但至少有两种选择:传递一个匿名类*,转换为适当的类型。

processor((Function<String, Integer>) s -> s.length());       // Function
processor((ItemProcessor<String, Integer>) s -> s.length());  // ItemProcessor

*这不是 lambda 表达式,将其划掉!

一个可能有助于调用这些方法的小技巧:

如果ItemProcessor扩展Function,它将消除转换为ItemProcessor

interface ItemProcessor<I, O> extends Function<I, O> {}

processor((Function<String, Integer>) String::length);  // Function
processor(s -> s.length());                             // ItemProcessor

推荐阅读