首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java 8扩展函数接口并将它们结合起来

Java 8扩展函数接口并将它们结合起来
EN

Stack Overflow用户
提问于 2016-05-03 23:02:31
回答 2查看 3.5K关注 0票数 6

我有一个函数接口,它将标准的jdk函数扩展到简单的泛型类型。现在我想使用andThen组合两个函数,这是抛出编译器错误。

错误:(25,25) java:接口java.util.function.Function<T,R>中的方法java.util.function.Function<T,R>不能应用于给定类型; 必需:java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>发现:ui.instrumentation.api.transformation.Transformer<T,R>原因:无法推断类型变量V(参数不匹配;ui.instrumentation.api.transformation.Transformer<T,R>不能转换为java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>)

下面是示例代码:

代码语言:javascript
代码运行次数:0
运行
复制
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));
    } 
}

是否有一种方法来组合扩展标准函数接口的函数,或者有更好的方法来实现这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-05-03 23:13:56

您需要同时修复您的泛型,与其使用只返回一个andThenFunction,不如自己插入lambda:

代码语言:javascript
代码运行次数:0
运行
复制
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));
} 
票数 5
EN

Stack Overflow用户

发布于 2016-05-04 00:04:31

第一个问题是,andThen获取一个函数的返回值,并使下一个函数的参数类型成为下一个函数的参数类型,因此,正如@LouisWasserman所解释的那样,需要将它们端到端地链接到一个匹配下一个输入类型的输出类型:

代码语言:javascript
代码运行次数:0
运行
复制
static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) {

正如他还解释的那样,第二个问题是您正在调用的Function.andThen返回的是一个Function,而不是一个Transformer。但是,请注意,FunctionTransformer具有相同的形状--单输入、单输出。正因为如此,您可以使用其中一个,然后使用如下方法引用将其修改为另一个:

代码语言:javascript
代码运行次数:0
运行
复制
static <T1, T2, T3> Transformer<T1, T3> combine(Transformer<T1, T2> first, Transformer<T2, T3> second) {
    return first.andThen(second)::apply;
}

您不需要创建一个函数就可以做到这一点。您可以使用同样的技术直接调用Function.andThen()

代码语言:javascript
代码运行次数:0
运行
复制
    Transformer<String,Integer> t1 = ...
    Transformer<Integer,Double> t2 = ...
    Transformer<Double,String> t3 = ...

    Transformer<String,String> t123 = t1.andThen(t2).andThen(t3)::apply;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37015799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档