2011-03-18 50 views
4

在下面的代碼中,您可以應用任何函數f(例如,加,減等)。我如何通過Java來做到這一點?與C++的for_each模板相當的Java是什麼?

template<class InputIterator, class Function> 
    Function for_each(InputIterator first, InputIterator last, Function f) 
    { 
    for (; first!=last; ++first) f(*first); 
    return f; 
    } 
+3

你有一本Java書嗎? C++不是Java,你不應該嘗試通過* C++學習Java *,你應該從頭開始學習它。(沒有什麼說明必須有等價;即使有,這可能不是Java中最好的方法。) – GManNickG 2011-03-18 19:20:42

+0

@GMan:是的,我只是試圖應用這個概念,如果我不能申請它。我只會做出多種功能。這只是我知道用C++的東西,我想就在java中使用它,如果可用 – 2011-03-18 19:22:37

+0

在這種情況下,你可能想仿製藥。 – 2011-03-18 19:33:14

回答

7

有是您需要對此代碼進行兩項重大更改才能使其在Java中工作。首先,你需要用Java風格的迭代器替換STL風格的迭代器,幸運的是,這並不難。其次,由於Java不支持函數指針,因此必須更改函數指針或函子參數與不同類型對象的使用。

在Java中,迭代器比C++更重,它封裝了它們遍歷的全部範圍,而不僅僅是該範圍的開始或結束。使用Java迭代器,可以使用.next()和.hasNext()方法遍歷範圍。

至於函數參數,您可能需要創建自己的接口來表示某個可以作爲函數調用的對象。例如:

public interface Operation<T> { 
    void apply(T argument); 
} 

這個接口是在某些類型T說參數類型是什麼一個通用的參數,然後導出一個叫做apply()函數適用的功能。

鑑於此,一個簡單而樸素的方式來複制的for_each是寫

public static <T> forEach(Iterator<T> itr, Operation<T> op) { 
    while (itr.hasNext()) 
     op.apply(itr.next()); 
} 

我之所以說這是幼稚的是,它並沒有正確地使用通配符有限,擴大地方範圍它可以使用。更合適的版本,更Java友好的將是這樣:

public static <T> forEach(Iterator<T> itr, Operation<? super T> op) { 
    while (itr.hasNext()) 
     op.apply(itr.next()); 
} 

諮詢爲什麼這個工程上的Java遺傳學的參考。

希望這會有所幫助!

+1

(對於(T obj:itr){op.apply(obj);}編譯:哦,你已經使用過'Iterator'了,使用'Iterable'! – 2011-03-18 19:34:29

+0

Can你認爲只能在數組和迭代器上使用這種類型的循環嗎? – templatetypedef 2011-03-18 19:35:29

+0

呃,是的,但是接下來使用'Iterable'會更接近於在C++中使用迭代器,而對於Java則是慣用的。 – 2011-03-18 19:37:17

0

要實現你會使用Java Generics

回調模板類,更可能你會想創建一個Interface,並通過它來實現通用類的對象,你」 d調用定義的方法。

0

你應該使用的接口,但是如果你想要做它在硬盤的方式,使用reflection(未測試,沒有異常檢查等,但你可以得到的想法):

public void myFunction(Collection items, String methodName) { 
    foreach(Object o : items) { 
     Method method = o.getClass().getMethod(methodName); 
     method.invoke(o); 
    } 
} 
0

隨着良好的面向對象設計,首先到最後將是一個特定的對象(實現一個接口)類型和f()將該類型(接口)的對象作爲參數,所以你完成 - 這是非常多的像你寫的。

如果你正在談論的是在原語上做它,那麼它將需要泛型,但在這一點上,你想尋找一個更好的設計或更好的方式來做到這一點。

如果我們知道更多關於您嘗試解決的問題以及限制條件,我們可能會提供更好的建議,但您沒有真正給出足夠的信息以獲得更詳細的答案。

相關問題