通用函数的迭代

时间:2016-09-06 08:51:20

标签: java function generics

我想创建一个函数列表,它具有以下行为:

     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;。 你有什么想法,怎么做?

3 个答案:

答案 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<?> domainTyperangeType(这是一个构造函数)`。

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));
}