我有有這個功能如何對每個項目進行迭代和執行一些任意操作?
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