Java8發布之后,Lambda表達式,Stream等等之類的字眼邊慢慢出現在我們字眼。就像是Java7出現了之后,大家看到了“鑽石語法”,看到了try-with-resource等等。面對這些新東西,如果它能為我們提供方便帶來不一樣的改變。那么就值得去嘗嘗鮮。Java8出現了之后,我就掃了一眼新東西。但是實際工作中普遍使用的是Jdk1.7,1,6。所以就一直“閑置”了。而今閑了就看看。
Lambda表達式是怎樣的?
下面將通過代碼的形式來演示Lambda表達式,需要先安裝JDK8.如果開發工具使用的是eclipse或者myeclipse的話,還需注意IDE的版本。版本低的還不支持Java8。
Lambda表達式如何創建一個線程?
我們知道創建線程有兩種方式:
1.寫一個類繼承自Thread類,並實現run方法。然后,調用子類的start()方法啟動線程。
2.實現Runable接口,並在run方法中寫具體實現。將Runable的實現類 當做參數傳遞給Thread類的構造函數完成線程的創建。
第二種方法的實現寫法可以如下:
例1-1
Thread sayHello=new Thread(new Runnable() { @Override public void run() { System.out.println("hello"); } }); sayHello.start();
上面代碼很簡單,Thread構造函數中接收了一個匿名函數。匿名函數返回的是一個Runnable接口實現。啟動線程之后,將會輸出:hello信息。
上面例1-1 中的代碼如果換成lambda表達式書寫的話,就會是下面這個樣子:
例1-2
Thread thread=new Thread(()-> System.out.println("hello")); thread.start();
只有兩行!怎么樣?這一點有沒有吸引到你。比起例1-1中的代碼,例1-2更簡潔,一目了然。這些改變就在於這一行代碼:
()-> System.out.println("hello")
這就是一個Lambda表達式。它既是一個“參數”,更是一個“動作”。 第一次看的話,會覺得很奇怪,但是大概感受一下它的作用,便可以做出理解這整個動作:()表示實現的是一個無參的方法。->后面指向的一句話 System.out.pringln("hello");這句代碼是方法體的具體實現,只是打印了一句話。這樣理解就很順了。下面再來看個例子。
使用Lambda表達式實現文件過濾
在File操作中我們可以實現 java.io.FileFilter 類來並在其accept 方法中編寫過濾文件的代碼實現。本例假設在windows系統中D盤有個文件夾resource,里邊有一些文件,有.jc,.html,.doc 等各種格式。現在要選出js文件。實現如下:
例2-1
//1.文件目錄 File fileDir=new File("D:/resource"); //2.創建篩選規則 FileFilter filter=new FileFilter() { @Override public boolean accept(File file) { if(!file.isDirectory()&&file.getName().endsWith(".js")){ return true; } return false; } }; //3.得到篩選文件 File[] files=fileDir.listFiles(filter);
其實功能很簡單,但是代碼不少。如果不是你寫的,而是你在閱讀別人的代碼,恐怕不是一眼能看出來的。還得從上到下,把這幾行都看了。但是,如果是lambda表達式寫的話就會使下面這個樣子:
例2-2
//1.文件目錄 File fileDir=new File("D:/resource"); //2.篩選 File [] files=fileDir.listFiles((f)->!f.isDirectory()&&f.getName().endsWith(".js"));
怎么樣,看起來是不是簡潔多了。
(f)->!f.isDirectory()&&f.getName().endsWith(".js")
這一行就表到了上面4,5行的含義。因為括號中只有一個參數f,所以,也可以省去括號:
f->!f.isDirectory()&&f.getName().endsWith(".js")
寫到這里。Lambda表達式的“長相”和“用途”已經展示出來了。個人感覺是優雅。只是初次看到的話,可能會覺得,一個括號,一個箭頭。什么玩意。
但是當你理解了之后,看起來就會順眼了。上面的兩個例子,分別介紹了有參合無參,有返回值和無返回值的情況演示。基本夠用了。具體編碼用的時候,根據具體邏輯寫實現就好了。例子中的lambda表達式是如下兩種:
()-> xxx
(x,y)->x,y的處理
可以看到,結構為 三部分,箭頭前的括號是方法頭部分,箭頭后面的是方法體實現。可以照葫蘆畫瓢,舉一反三來寫其他類型的lambda表達式寫法。
1.如何理解lambda表達式。
答:其實就是一行代碼,作為參數傳遞。既是一個參數,又是一組有“動作”的代碼。
2.為什么例2-2中的代碼,(f) 參數f參數類型都沒有,一般的方法不都是指明參數類型的嗎。這里都沒說f是File類型的,為什么會不報錯呢?
答:類型推斷。
推薦閱讀
[探索Java9 模塊系統和反應流](https://www.cnblogs.com/demingblog/p/9104103.html)
Java8系列- 如何用Java8 Stream API找到心儀的女朋友
Java8系列- 何用Java8 Stream API進行數據抽取與收集
SpringMVC是怎么工作的,SpringMVC的工作原理
Mybatis Mapper接口是如何找到實現類的-源碼分析