Java 8 扩展函数接口(interface)并组合它们

标签 java lambda functional-programming java-8

我有一个功能接口(interface),可以将标准 jdk 功能扩展到简单的泛型类型。现在我想使用 andThen 组合两个函数,这会引发编译器错误

Error:(25, 25) java: method andThen in interface java.util.function.Function<T,R> cannot be applied to given types;
required: java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V> found: ui.instrumentation.api.transformation.Transformer<T,R> reason: cannot infer type-variable(s) V (argument mismatch; ui.instrumentation.api.transformation.Transformer<T,R> cannot be converted to java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>)

示例代码如下:

public interface Transformer<T,R> extends Function<Message<T>, Message<R>> {

    static <T, R> Transformer<T, R> combine2(Transformer<T, R> first, Transformer<T, R> second) {
        return first.andThen(second));
    } 
}

有没有一种方法可以组合扩展标准 Function 接口(interface)的函数,或者有更好的方法吗?

最佳答案

你需要修复你的泛型,而不是使用 andThen,它只会返回一个 Function,你最好自己内联 lambda:

static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) {
    return (Message<T1> input) -> second.apply(first.apply(input));
} 

关于Java 8 扩展函数接口(interface)并组合它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37015799/

相关文章:

java.lang.RuntimeException : Layout cannot be null. 调用 setLayout

java - 使用 IntStream 创建数组的随机子集的快速方法

python - 使用部分参数创建 Python 函数

Java8 Lambda 和异常

java - 编写 Java 函数和使用者

haskell - 如何使用 Supply monad 创建一个生成全局唯一名称的函数?

java - 如何使用行的 ID 获取行所在的区域?

java - JSF2 : Using EL in navigation rules. 超时重定向?

java - 什么是微基准测试?

programming-languages - 命令式语言中可以使用哪些函数式语言技术?