這節,我們來通過具體的實例來看看Java8的具體用法。
首當其沖,就是lambda用法。
這里的案例,就是用lambda來實現runnable接口,我們知道以前用匿名內部類的方式來實現runnable接口,這種方法晦澀難懂,用lambda表達式實現以后,這樣的代碼清爽了不少。上兩種對比的代碼:
public static void main(String[] args) { new Runnable() { public void run() { System.out.println("這是匿名內部類實現的runnable接口"); } }.run(); int i=0; Runnable runnable=()->{ System.out.println("i="+i); System.out.println("aaaaaaaaaaaaaa"); }; runnable.run(); }
通過上述代碼了,我們可以明明白白的看到這回事,lambda表達式中能夠訪問非靜態的局部變量,這樣,我們程序員們的代碼是不是少寫了很多,層次結構明了了很多。
案例二,我們分別用匿名內部類和lambda表達式來實現接口中帶參的方法,比較孰優孰劣。
我們這里做一個接口叫IAction,分別讓其實現,上代碼:
package test; public class TestInterface { public static void main(String[] args) { IAction iAction=new IAction() { @Override public void excute(String content) { // TODO Auto-generated method stub System.out.println(content); } }; iAction.excute("aaaa"); IAction iAction2=(String content)->{ System.out.println(content); }; iAction2.excute("bbbb"); } static interface IAction{ void excute(String content); } }
根據上面的代碼,我們得出來這樣的總結:
①利用lambda表達式以后,代碼編寫的篇幅大量的減少。
②利用lambda表達式以后,不用顯式進行方法名稱的調用。
③利用lambda表達式以后,代碼的層次感更加強烈明了。
而Stream接口類似於一個什么了,一個泛型接口,使用戶聯合lambda表達式使其對數據集的操作更加的方便。下面,我通過一個對list操作的例子,老看看stream接口確實是為為集合操作帶來了不少的好處。首先來一個people的實體類:
static class People{ String name; int age; double height; public People(String name, int age, double height) { super(); this.name = name; this.age = age; this.height = height; } @Override public String toString() { // TODO Auto-generated method stub return "People[ name="+name+",age="+age+",height="+height+"]."; } }
然后來一個創建list集合的方法,源代碼如下:
static List<People> createPeople() { List<People> peoples=new ArrayList<People>(); People people=new People("鄭飛", 34, 1.99); peoples.add(people); people=new People("劉飛", 29, 1.89); peoples.add(people); people=new People("馬飛", 24, 1.79); peoples.add(people); people=new People("王菲", 19, 1.69); peoples.add(people); return peoples; }
接着,來一個Stream接口,將其利用Foreach循環將其輸出,源代碼如下:
public static void main(String[] args) { List<People> peoples= createPeople(); Stream<People> stream= peoples.stream(); stream.forEach((e)->{System.out.println(e.toString());}); }
運行結果如下:
可見,Stream接口作用有如下:
流可以是無限的、有狀態的,可以是順序的,也可以是並行的。在使用流的時候,你首先需要從一些來源中獲取一個流,執行一個或者多個中間操作,然后執行一個最終操作。中間操作包括filter、map、flatMap、peel、distinct、sorted、limit和substream。終止操作包括forEach、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst和findAny。 java.util.stream.Collectors是一個非常有用的實用類。該類實現了很多歸約操作,例如將流轉換成集合和聚合元素。 使其對集合操作更加靈活。
說了這么多謂詞操作,我這里用filter實例作為講解。
再上述的代碼中,加上短短的一句代碼,就ko了。
stream=stream.filter(e->e.getAge()>20);
可見了,有了這些操作的方法以后,操作集合也不需要你寫過多的代碼,就像sql一樣,利用命令式語言來處理集合操作了。
通過了,這些Java8的小案例,我們明白了,lambda表達式和Stream雖然是采用c2c(copy to C#)的方式,但是C#多年的經驗確實告訴我們了,確實很好用,一切語言都是為了我們,使我們少寫代碼,提高相應的工作效率而奮斗。