lambda表達式傳參


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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM