java—如何迭代并对每个项执行一些任意操作?

tkclm6bt  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(308)

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

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

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

tuwxkamq

tuwxkamq1#

在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());
    }
}
j8ag8udp

j8ag8udp2#

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

void apply(Object arg)

然后可以创建实现函数的不同类,并将这些类传递到迭代方法中。在您的示例中,您可能会这样做:

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

brvekthn3#

我会重新考虑命名以澄清语义:
在迭代器中有一个方法:

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

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

相关问题