2009-11-04 43 views

回答

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()); 
    } 
} 
+2

基本上这是目前唯一的可能性,即使在Java 7中也没有关闭。 – Esko 2009-11-04 18:19:32

+1

删除它们的决定是一个令人难过的决定:( – Malaxeur 2009-11-04 18:24:56

+2

这是正确的,只是想我会指出,这被称为命令模式,这是一种非常有用的模式,在您使用过几次后,您会直觉地开始使用它。 – vickirk 2009-11-04 19:37:34

0

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

void apply(Object arg) 

然后,您可以创建实现功能,并通过这些到您的迭代方法不同类别的假此。在你的榜样,你会做这样的事情也许是:

public class PrintFunction implements Function { 
     void apply(Object arg) { 
       System.out.println(arg.toString()); 
     } 
    } 
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,但在某些情况下,您确实需要某种伪关闭来执行需要上下文的操作。为了使这更健壮,你可以考虑添加异常处理。

相关问题