我想创建一个函数列表,它具有以下行为:
static List createList(){
Function<A,B> f1;
Function<B,C> f2;
Function<C,D> f3;
Function<D,A> f4;
return Arrays.asList(f1,f2,f3,f4);
}
这只是一个例子。我想有一个列表,可以有任何大小,下一个函数的参数是之前函数的结果。 有什么方法可以参数化返回类型吗?列表什么?
我想将此列表提供给一个方法,该方法强制获取上述行为的列表。例如:
public void process(List/** generic type? **/ list){
Object res = null;
for(Function f : list){
// do work
System.out.print("works result");
res = f.apply(res);
// do other work
}
}
虽然我想&#34; res&#34;是通用的。和List一样。而功能也是如此。我不喜欢使用&#34;功能&lt; ?,?&gt;&#34;。 你有什么想法,怎么做?
答案 0 :(得分:2)
忘记使用List
,您不需要。
在Java中,您可以直接组合函数,只返回&#34;整体&#34;函数,避免客户端代码在函数列表上手动迭代(通过强制执行顺序减少错误,使代码更简单)。
private static <A, B, C> Function<A, A> createFunction() {
Function<A, B> f1 = //TODO
Function<B, C> f2 = //TODO
Function<C, A> f3 = //TODO
return f1.andThen(f2).andThen(f3);
}
答案 1 :(得分:0)
也许这有助于你。
public class A : ITest
{
}
public class B : ITest
{
}
public class C : ITest
{
}
public class D : ITest
{
}
static List createList(){
Function<ITest,ITest> f1 = new Function<A,B>;
Function<B,C> f2 = new Function<B,C>;
Function<C,D> f3 = new Function<C,D>;
Function<D,A> f4 = new Function<D,A>;
return Arrays.asList(f1,f2,f3,f4);
}
public void process(ArrayList<Function<ITest,ITest>> list){
//do some stuff
}
其中ITest是您应该为这些类定义的接口。
答案 2 :(得分:-1)
运行时类型信息的时间,尽管这几乎是无类型用法。
因此,查询自己该类是否需要泛型参数,或者是否足以拥有Class<?> domainType
和rangeType
(这是一个构造函数)`。
public static class TypedFunction<D,R> {
public final Class<D> domainType;
public final Class<R> rangeType;
public final Function<D, R> function;
public TypedFuntion(Class<D> domainType, Class<R> rangeType, Function<D, R> function) {
this.domainType = domainType;
this.rangeType = rangeType;
this.function = function;
}
}
static List<TypedFunction<?,?>> createList(){
Function<A,B> f1;
Function<B,C> f2;
Function<C,D> f3;
Function<D,A> f4;
return Arrays.asList(
new TypedFunction(A.class, B.class, f1),
new TypedFunction(B.class, C.class, f2),
...);
}
这允许使用这些功能,但是很麻烦。
TypedFunction f = ...
Object a = ...
B b; // Non-generic class B
if (B.class.isAssignableFrom(f.rangeType)) {
b = (B) f.apply(f.domainType.cast(a));
}