Raj*_*aja 6 java lambda functional-programming java-8
我有一个功能接口,它将标准的jdk函数扩展为泛型类型.现在我想使用andThen组合两个函数,这会抛出编译器错误
错误:(25,25)java:方法然后在接口
java.util.function.Function<T,R>中不能应用于给定的类型;
required:java.util.function.Function<? super ui.instrumentation.api.messaging.Message<R>,? extends V>found:ui.instrumentation.api.transformation.Transformer<T,R>reason:无法推断类型变量(s)V(参数不匹配;ui.instrumentation.api.transformation.Transformer<T,R>无法转换为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));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法组合扩展标准功能接口的功能或有更好的方法来做到这一点?
你需要修复你的泛型,而不是使用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));
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是andThen获取一个函数的返回值并使其成为下一个函数的参数类型,因此您需要像@LouisWasserman所解释的那样,将输出类型与输入类型匹配的输出类型端到端地链接起来下一个:
static <T1, T2, T3> Transformer<T1, T3> combine2(Transformer<T1, T2> first, Transformer<T2, T3> second) {
Run Code Online (Sandbox Code Playgroud)
正如他所解释的那样,第二个问题是Function.andThen,你所呼唤的问题是Function,而不是a Transformer.但是请注意,这Function与Transformer具有相同的形状-单输入单输出.因此,您可以使用一个,然后使用如下方法引用将其调整到另一个:
static <T1, T2, T3> Transformer<T1, T3> combine(Transformer<T1, T2> first, Transformer<T2, T3> second) {
return first.andThen(second)::apply;
}
Run Code Online (Sandbox Code Playgroud)
您无需创建执行此操作的函数.您可以使用相同的技术Function.andThen()直接调用:
Transformer<String,Integer> t1 = ...
Transformer<Integer,Double> t2 = ...
Transformer<Double,String> t3 = ...
Transformer<String,String> t123 = t1.andThen(t2).andThen(t3)::apply;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2008 次 |
| 最近记录: |