Java 如何迭代并对每个项执行任意操作?

Java 如何迭代并对每个项执行任意操作?,java,polymorphism,Java,Polymorphism,我有一个抽象迭代器类,它有这个函数 void iterate(){ while(this.hasnext()){ ..this.next().. } } 如何传入将应用于下一个元素的任意函数。例如,是否有方法进行迭代(打印)?在Java中,不可能直接将函数作为参数传入。相反,您需要使用以下方法设置一个接口: interface Operate { public void operate(Object o); } 然后,您需要为要在对象上执行的每个不同操

我有一个抽象迭代器类,它有这个函数

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

如何传入将应用于下一个元素的任意函数。例如,是否有方法进行迭代(打印)?

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

interface Operate {
    public void operate(Object o);
}
然后,您需要为要在
对象上执行的每个不同操作实现接口

一个示例实现

class Print implements Operate {
    public void operate(Object o){
        System.out.println(o.toString());
    }
}
代码中的实现:

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

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

interface Operate {
    public void operate(Object o);
}
然后,您需要为要在
对象上执行的每个不同操作实现接口

一个示例实现

class Print implements Operate {
    public void operate(Object o){
        System.out.println(o.toString());
    }
}
代码中的实现:

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

你认为打印是一种功能吗?Java没有函数指针、实闭包或任何允许您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法

void apply(Object arg)
然后可以创建实现该函数的不同类,并将它们传递到迭代方法中。在您的示例中,您可能会这样做:

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

你认为打印是一种功能吗?Java没有函数指针、实闭包或任何允许您将任意函数传递给其他函数的东西,就像您在更多函数语言中看到的那样。你可以通过创建一个函数接口来伪造它,函数接口有一个方法

void apply(Object arg)
然后可以创建实现该函数的不同类,并将它们传递到迭代方法中。在您的示例中,您可能会这样做:

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

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

在迭代器中具有方法:

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);
}
公共对象[]应用(操作、对象上下文){
列表结果=新建ArrayList();
while(hasNext()){
add(action.invoke(this.next(),context));
}
T[]r=新的T[results.size()];
返回结果。toArray(r);
}
公共接口操作{
公共T调用(对象目标、对象上下文);
}

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

< P>我会重新考虑命名来澄清语义:

在迭代器中具有方法:

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);
}
公共对象[]应用(操作、对象上下文){
列表结果=新建ArrayList();
while(hasNext()){
add(action.invoke(this.next(),context));
}
T[]r=新的T[results.size()];
返回结果。toArray(r);
}
公共接口操作{
公共T调用(对象目标、对象上下文);
}

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

基本上这是目前唯一的可能性,即使在java 7中也没有关闭。(这是正确的,我想指出的是,这被称为命令模式,一种非常有用的模式,在您使用过几次之后,您会本能地开始使用它。基本上,这是目前唯一的可能性,即使在Java 7中也没有闭包。删除它们的决定是一个令人悲伤的决定:(这是正确的,我想指出的是,这被称为命令模式,一种非常有用的模式,在你使用过几次之后,你会本能地开始使用它。