2016-11-19 60 views
-1

我有ArrayList和lambda表達式的問題。我有代碼:ArrayList上的Lambda表達式

MyList<Integer> list = MyList.make(1,2,8, 10, 11, 30, 3, 4); 
list.letsGo((e, i) -> list.set(i, e*2)); 

e - element 
i - index 

我應該如何爲每個lambda表達式實現(e, i)

void letsGo(Function function) 

你能幫我實施嗎?如何從參數中獲取lambda表達式?我知道apply方法,但我不知道如何使用它..

+0

首先,如果你知道了'apply'方法,爲什麼不打電話了嗎?其次,'Function'只需要一個參數,但你的lambda需要兩個參數。因此它們不兼容。在不知道'set'的簽名的情況下,我不能提出另一種選擇。 –

+0

'letsGo'方法應該做什麼? – Andrew

+0

執行拉姆達,在該表達式,每個元素由對子級由元件代替* 2 – Alohomora

回答

0

如果你想實現一個letsGo()方法,可以使用帶有兩個輸入的lambda表達式,那麼我認爲你想簽名

void letsGo(BiConsumer<? super T, ? super Integer> consumer) 

我不相信這是設計類的最佳方法(我已經預計需要的功能的方法,和更新:像以下(假設MyListT類型參數化)所有的值在原地,如Stream.map()確實,而不需要在您的lambda中調用list.set()

很明顯,你如何實現這個方法取決於如何MyList實現,但是一個例子可能是以下幾點:

public class MyList<T> { 
    private Map<Integer, T> values = new HashMap<>(); 

    public void set(int i, T value) { 
     values.put(i, value); 
    } 

    public void letsGo(BiConsumer<? super T, ? super Integer> consumer) { 
     System.out.println("Let's Go"); 
     values.entrySet().forEach(e -> consumer.accept(e.getValue(), e.getKey())); 
    } 

    @Override 
    public String toString() { 
     return values.toString(); 
    } 

    public static void main(String[] args) { 
     MyList<Integer> myList = new MyList<>(); 
     myList.set(0, 0); 
     myList.set(1, 1); 
     myList.set(2, 2); 

     System.out.println(myList.toString()); 
     myList.letsGo((e, i) -> myList.set(i, e * 2)); 
     System.out.println(myList.toString()); 

     // Output: 
     // {0=0, 1=1, 2=2} 
     // Let's Go 
     // {0=0, 1=2, 2=4} 
    } 
} 
+1

'BiConsumer <?超級T,?超級整數>'可能會有所改進。 –

+1

大多數集合,包括'HashMap',在迭代時都不喜歡被操縱。它可能在這個特定的情況下工作,但仍然不是實現它的正確方法。畢竟,爲什麼要爲每個元素執行哈希查找,當有一個像'replaceAll'這樣的現成方法可以在沒有額外查找的情況下完成這項工作。此外,爲什麼使用'Map '而不是'List '? 。 – Holger

+0

如果你堅持到'Map'方法,您可以替換'values.entrySet()的forEach(E - > consumer.accept(e.getValue(),e.​​getKey()));'用簡單得多' values.forEach(消費者);' – Holger