如何在每个项目上迭代并执行一些任意操作?

时间:2009-11-04 18:07:55

标签: java polymorphism

我有一个具有此功能的Abstract Iterator类

void iterate(){
    while(this.hasnext()){
        ..this.next()..
    }
}

如何传入将应用于下一个元素的任意函数。例如,有没有办法iterate(print)

3 个答案:

答案 0 :(得分:9)

在Java中,不可能直接将函数作为参数传递。相反,您需要使用以下一种方法设置接口:

interface Operate {
    public void operate(Object o);
}

然后,您需要为Object上要执行的每个不同操作实现接口。

示例实现。

class Print implements Operate {
    public void operate(Object o){
        System.out.println(o.toString());
    }
}

在您的代码中实施:

iterate(Operate o){
    while(this.hasnext()){
        o.operate(this.next());
    }
}

答案 1 :(得分:1)

我会重新考虑命名以澄清语义:

在迭代器中有一个方法:

public <T> Object[] apply (Action<T> action, Object context) {
   List<T> results = new ArrayList<T>();
   while(hasNext()) {
       results.add(action.invoke(this.next(), context));
   }
   T[] r = new T[results.size()];
   return results.toArray(r);
}


public interface Action <T> {
   public T invoke (Object target, Object context);
}

上下文可以为null,但在某些情况下,您确实需要某种伪闭包来执行需要上下文的操作。为了使其更加健壮,您可以考虑添加异常处理。

答案 2 :(得分:0)

您是否认为打印是一种功能? Java没有函数指针或真正的闭包或任何可以将任意函数传递给其他函数的东西,就像你在更多函数式语言中看到的那样。您可以通过创建一个具有一个方法

的Function接口来伪装它
void apply(Object arg)

然后,您可以创建实现Function的不同类,并将它们传递给您的iterate方法。在你的例子中,你可能会这样做:

    public class PrintFunction implements Function {
        void apply(Object arg) {
              System.out.println(arg.toString());
        }
    }