2009-11-04 132 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,但在某些情況下,您確實需要某種僞關閉來執行需要上下文的操作。爲了使這更健壯,你可以考慮添加異常處理。

相關問題