1.1 lambda表达式
一、處理匿名內(nèi)部類
1、Runnable接口
1 new Thread(new Runnable() { 2 public void run() { 3 System.out.println("hello world!!!"); 4 } 5 }).start(); 6 7 // lambda 8 new Thread(()->System.out.println("hello lambda!!!")).start();說(shuō)明:
- 上邊的方式是原本匿名內(nèi)部類方式
- 下邊的方法是lambda表達(dá)式方式
lambda基本語(yǔ)法:(形參列表)->{方法體}
注意:
- 形參列表:(String x, String y)這樣的基本形式
- 如果沒有形參,使用"()",如上
- 如果參數(shù)類型可以被推斷出來(lái),使用(x,y)
- 如果是單個(gè)參數(shù)且類型可以被推斷出來(lái),直接使用x
- 方法體:如果只有一句話,可以去掉"{}",如上
2、Comparator接口
1 List<String> strList = Arrays.asList("zhaojigang","nana","tianya"); 2 //原來(lái)的方式 3 Collections.sort(strList, new Comparator<String>() { 4 @Override 5 public int compare(String s1, String s2) { 6 return s1.compareTo(s2); 7 } 8 }); 9 10 //lambda 11 Collections.sort(strList, (s1, s2)->s1.compareTo(s2));說(shuō)明:這里的s1和s2就被根據(jù)comparator的泛型和strList的泛型推斷出了類型為String,可以省略參數(shù)類型。
二、方法引用
1 //lambda 2 Collections.sort(strList, (s1, s2)->s1.compareTo(s2)); 3 //方法引用 4 Collections.sort(strList, String::compareTo); 5 //lambda 6 strList.forEach(x->System.out.println(x)); 7 //方法引用 8 strList.forEach(System.out::println);說(shuō)明:
- 前兩個(gè)語(yǔ)句效果一樣,后兩個(gè)效果一樣,自己比對(duì)方法引用與lambda的哪些部分等價(jià)
- 集合類的foreach方法就是增強(qiáng)型for循環(huán)的再增強(qiáng)。
注意:
- 方法引用的語(yǔ)法
- 對(duì)象::實(shí)例方法=>等價(jià)于"提供方法參數(shù)的lambda表達(dá)式"
- 類::靜態(tài)方法=>等價(jià)于"提供方法參數(shù)的lambda表達(dá)式"
- eg.?System.out::println等價(jià)于x->System.out.println(x)
- 類::實(shí)例方法=>第一個(gè)參數(shù)是執(zhí)行方法的對(duì)象
- eg.?String::compareTo等價(jià)于(s1, s2)->s1.compareTo(s2)
三、局部變量
lambda操作的局部變量必須是final型的,即:在lambda表達(dá)式所使用到的局部變量(方法體內(nèi)的變量或形參)只能被讀取,不能被改變。
注意:列出這條約束的原因是防止線程不安全,可能會(huì)有疑問(wèn),局部變量是方法私有的,怎么會(huì)有線程安全問(wèn)題?
解釋:假設(shè)我在該方法體內(nèi),啟動(dòng)了一個(gè)線程并使用lambda表達(dá)式去操作一個(gè)局部變量count(注意該變量并沒有在lambda中進(jìn)行聲明,但是lambda卻可以用,這就是"閉包"),而在該線程外且在該方法體內(nèi),該方法也操作了count,這時(shí)可能就會(huì)有線程安全問(wèn)題了。
四、接口的改變
java的接口也可以寫實(shí)現(xiàn)default級(jí)別的實(shí)例方法和靜態(tài)方法了。
1 public interface LambdaInterface { 2 //default方法 3 default void defaultMethod(){ 4 System.out.println("xxxx"); 5 } 6 //static方法 7 static void staticMethod(){ 8 System.out.println("xxxx"); 9 } 10 } 1 public class TestInterface implements LambdaInterface{ 2 public static void main(String[] args) { 3 LambdaInterface test = new TestInterface(); 4 test.defaultMethod();//default方法測(cè)試 5 6 LambdaInterface.staticMethod();//static方法測(cè)試 7 } 8 }用途:當(dāng)改造老的項(xiàng)目時(shí),想在舊的接口中添加一些方法,但是又不想讓該接口的舊的實(shí)現(xiàn)類去實(shí)現(xiàn)這些方法時(shí),可以使用這個(gè)技巧。
總結(jié)
以上是生活随笔為你收集整理的1.1 lambda表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js实现上传图片及时预览
- 下一篇: Java判断字符串的开头和结尾