java8新特性之lambda運算式(二)__java

來源:互聯網
上載者:User
lambda運算式中的變數:

需求1:建立一個方法,在方法中開一個線程,線上程中輸出3個“helloWord”

1.普通的寫法:

    public static void main(String[] args) {        printHello("HelloWord",3);    }    --------------------------------------------    //參數底層使用的都加了final修飾    public static void printHello(String name,int count){        //在這裡定義的變數,底層也是加了final修飾        String ch="!";        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < count; i++) {                    //為什麼內部類可以直接使用外部類額變數。。。。。                    System.out.println(i+name+ch);                }                System.out.println(this);//列印內部類對象的地址,這個this代表是內部類的this,因為這個是靜態方法,外部類對象不存在            }        }).start();    }    -------------------------------------------    輸出結果:    0HelloWord!    1HelloWord!    2HelloWord!    3HelloWord!    4HelloWord!    lambada.TestLambda$1@2980e8cb //這個是內部類

2.反編譯上面printHello()方法:

    //參數底層使用的都加了final修飾    public static void printHello(final String name, final int count)    {        //在這裡定義的變數,底層也是加了final修飾        final String ch = "!";        (new Thread(new Runnable() {            private final int val$count;            private final String val$name;            private final String val$ch;            public void run()            {                for (int i = 0; i < count; i++)                    System.out.println((new StringBuilder(String.valueOf(i))).append(name).append(ch).toString());                System.out.println(this);            }                   {                count = i;                name = s;                ch = s1;                super();            }        })).start();    }

反編譯printHello()方法,可以知道:

1.printHello()的參數底層使用的都加了final修飾

2.在printHello()中定義的變數也加了final修飾

3.this是指向,內部類的this

2.lambda運算式的寫法:

    public static void main(String[] args) {        new TestLambda().printHello("HelloWord",3);    }    ---------------------------------------------    //參數的在底層被fianl修飾,所以可以在lambda運算式中可以直接使用該自由變數    public  void printHello(String name,int count){        //在這裡定義的局部變數,底層也是加了final修飾        String ch="!";        new Thread(()->{            for (int i = 0; i < count; i++) {                System.out.println(i+name+ch);            }            System.out.println(this);//這個this不是內部類的this,而是外部類的this        }        ).start();    }    -------------------------------------------    輸出結果:    0HelloWord!    1HelloWord!    2HelloWord!    lambada.TestLambda@663a8ec8 //這個是外部類

從列印的結果可以知道:

1.printHello()的參數底層使用的都加了final修飾

2.在printHello()中定義的變數也加了final修飾

3.在lambda中的this是指向,建立lambda運算式的方法中的this,而不是內部類的this lambda運算式中變數的3種類型:

1.參數//例如:運算式中的(User o1,User o2)參數2.局部變數//例如:方法中定義的變數3.自由變數(不是參數也不是局部變數)//例如:方法中的參數

總結:

結論:1.lambda運算式中的自由變數會被儲存,無論什麼時候執行lambda運算式,都可以直接使用;2.自由變數在lambda運算式中是不能修改的,因為自由變數是被final修飾3.參數和局部變數的使用方式和普通的使用方式相同;4.lambda運算式中的this指向,建立lambda運算式的方法中的this,而不是內部類的this

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.