2014-07-06 37 views
3

嗯,我挖通過Java8 Lambda和我現在面臨如下問題 - 拉姆達不改變數據:的Java 8拉姆達不改變數據

DamnLambda.class:

public static void inc (List<Integer> list, Funtion<Integer,Integer> func) { 

    for(Integer intr : list) { 
     intr = func.apply(intr); 
    } 

讓我們嘗試調用:

List<Integer> l = Arrays.asList(1,2,3); 

DamnLambda.inc(l, x -> x+=1); 
System.out.println(l); //[1,2,3] ? Why not [2,3,4] ? 

我不能低估它爲什麼不改變任何數據。 我也嘗試過不同版本的相同的功能:

l.forEach(x -> x+1); //same thing, doesn't change the data. 

缺少什麼我在這裏?

+3

將值賦給循環迭代變量將不起作用,實際上不應該這樣做。 –

+3

您錯過了函數式編程的要點。你不應該改變輸入。你應該生成輸出的變換。 –

+0

好吧,你讓我了,我一味地試圖在列表上執行一些lambda操作,並忘記了原始規則之一。順便說一句。代碼編譯。 – krzakov

回答

3

更改inc()到:

public static List<Integer> inc (List<Integer> list, Funtion<Integer,Integer> func) { 

    List<Integer> result = new ArrayList<Integer>(); 
    for(Integer intr : list) { 
     result.add(func.apply(intr)); 
    } 
    return result; 
} 

,然後調用:

l = DamnLambda.inc(l, x -> x+=1); 
8

如何:

list.replaceAll(x -> x+1); 
+0

它比前一個更好,但我之前將其標記爲答案,因爲他反映了我的想法。我試圖在實踐中理解使用lambda。 – krzakov

+0

+1只是想說,我是一個很大的粉絲:-) – alfasin

4

Brian Goetz' answer顯然,如果你想變異名單使用的那一個到位。 alfasin's answer似乎正在描述的另一種方法是創建一個包含修改值的新列表。使用lambda和stream的方法如下:

List<Integer> result = 
    list.stream() 
     .map(i -> i + 1) 
     .collect(Collectors.toList()); 
+0

有用,我打算今天通過流:) – krzakov