我有有这个功能如何对每个项目进行迭代和执行一些任意操作?
void iterate(){
while(this.hasnext()){
..this.next()..
}
}
我如何通过在将被应用于下一个元素任意功能的抽象迭代器类。例如,有没有办法做iterate(print)
?
我有有这个功能如何对每个项目进行迭代和执行一些任意操作?
void iterate(){
while(this.hasnext()){
..this.next()..
}
}
我如何通过在将被应用于下一个元素任意功能的抽象迭代器类。例如,有没有办法做iterate(print)
?
在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());
}
}
你假设打印是一个函数? 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);
}
上下文可以null,但在某些情况下,您确实需要某种伪关闭来执行需要上下文的操作。为了使这更健壮,你可以考虑添加异常处理。
基本上这是目前唯一的可能性,即使在Java 7中也没有关闭。 – Esko 2009-11-04 18:19:32
删除它们的决定是一个令人难过的决定:( – Malaxeur 2009-11-04 18:24:56
这是正确的,只是想我会指出,这被称为命令模式,这是一种非常有用的模式,在您使用过几次后,您会直觉地开始使用它。 – vickirk 2009-11-04 19:37:34