Lambda表達式中使用的變量需要遵循以下規則:
1、只能引用標記了 final 的外層局部變量,這就是說不能在 lambda 內部修改定義在域外的局部變量,否則會編譯錯誤。
2、局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(即隱性的具有 final 的語義)
3、不允許聲明一個與局部變量同名的參數或者局部變量。
下面這段代碼編譯器會報錯:
public static void main(String args[]){ List<String> dest = new ArrayList<>(); List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03")); src.forEach(item -> { add(dest,item); }); dest = null; }
因為違反了第二條規則(局部變量可以不用聲明為 final,但是必須不可被后面的代碼修改(即隱性的具有 final 的語義))
稍作修改,去掉對dest的修改,可以編譯通過:
public static void main(String args[]){ List<String> dest = new ArrayList<>(); List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03")); src.forEach(item -> { add(dest,item); }); }
通過lambda表達式,向線程中傳遞局部變量,並且執行相關操作:
public static void main(String args[]){ List<String> dest = new ArrayList<>(); List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03")); new Thread(()->add(dest,"a")).start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(dest.size()); } private static void add(List<String>l,String item){ l.add(item); System.out.println(item); }
