JAVA8新特性會顛覆整個JAVA程序員的編程習慣java
甚至若是您堅守JAVA7以前的編程習慣,從此你看比較年輕的程序員寫的JAVA代碼都會沒法理解程序員
因此爲了保證不脫鉤,我以爲有必要學習JAVA8的新特性,何況,這會極大得提升CPU效率和編碼效率編程
咱們來簡單瞭解一下JAVA8的新特性框架
我以爲主要有兩個比較重要的,一是Lambda表達式,二是集合類的stream操做eclipse
關於這兩點,我寫了幾個小DEMO,附上註釋,應該可以迅速掌握編程語言
若是你們好奇更多的JAVA8新特性,請自行閱讀更加專業的知識,敏捷開發不求甚解是個人編程態度。函數式編程
順便說一句,JAVA8目前只有最新版eclipse MARs支持編譯函數
即便您下載了JAVA8的JDK和JRE,myeclipse目前還不支持對JAVA8的編譯學習
也就是說下面的代碼會在myeclipse下面報錯的。編碼
package com.newflypig.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class TestJava { public static void main(String[] args) { // java8 的新特性,lambda表達式,相似於匿名內部類 Thread testThread = new Thread(() -> { List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("aa"); list.add("bb"); list.add("cc"); list.forEach(s -> { System.out.println(s); ; }); list.stream().filter(s -> s.length() == 2).forEach(s -> { System.out.println(s); }); }); System.out.println("======================================"); distinct("2", "3", "4", "5", "6", "7", "8", "9", "2", "3", "4", "5", "6", "7", "8", "9"); testThread.run(); } // 新特性,不定參數 private static void distinct(String... numbers) { List<String> list = Arrays.asList(numbers); List<Integer> listInt = list.stream() .map(s -> Integer.parseInt(s)) // 將集合流中的元素一一映射爲一個新的元素,並生成到新的輸出流中 .filter(a -> isPrime(a)) // 過濾,lambda表達式 .distinct() // stream的高級方法,去除重複 .collect(Collectors.toList()); // 將整理好的輸出流收集到新的listInt集合中 /** * 你可能會以爲在這個例子裏,List list被迭代了好屢次, * map,filter,distinct都分別是一次循環,效率會很差。 * 實際並不是如此。這些返回另外一個Stream的方法都是「lazy」的,而最後返回最終結果的collect方法則是「eager」的。 * 在遇到eager方法以前,lazy的方法不會執行。 * * 當遇到eager方法時,前面的lazy方法纔會被依次執行。 * 並且是管道貫通式執行。這意味着每個元素依次經過這些管道。 * 例若有個元素「3」,首先它被map成整數型3; * 而後經過filter,發現是素數,被保留下來;又經過distinct, * 若是已經有一個3了,那麼就直接丟棄,若是尚未則保留。這樣,3個操做其實只通過了一次循環。 * * 除collect外其它的eager操做還有forEach,toArray,reduce等 */ listInt .stream() .forEach(i -> { // stream的forEach,相似於Collections.forEach System.out.println(i); }); int sum=listInt .stream() .reduce((isum,item)->isum+item) .get(); int min=listInt .stream() .reduce((a,b)->a<b?a:b) .get(); int max=listInt .stream() .reduce((a,b)->a>b?a:b) .get(); /** * reduce方法接受一個函數,這個函數有兩個參數, * 第一個參數是上次函數執行的返回值(也稱爲中間結果), * 第二個參數是stream中的元素,這個函數把這兩個值相加, * 獲得的和會被賦值給下次執行這個函數的第一個參數。 * 要注意的是:第一次執行的時候第一個參數的值是Stream的第一個元素, 第二個參數是Stream的第二個元素。 * 這個方法返回值類型是Optional,這是Java8防止出現NPE(NULL POINT ELEMENT)的一種可行方法, * 這裏就簡單的認爲是一個容器,其中可能會包含0個或者1個對象。 */ System.out.println(sum+"\t"+min+"\t"+max); } private static boolean isPrime(int a) { boolean flag = true; for (int i = 2; i <= a / 2; i++) { if (a % i == 0) { flag = false; break; } } return flag; } }
對於JAVA8的新特性的學習,能夠淺嘗輒止,由於大部分現有的框架,目前並且之後至關長時間不會遷移到JAVA8上。
不過新特性Lambda表達式的引入,我感受會爆發出另外一批更爲優秀的框架出來
從形式上看,λ表達式只是爲你節省了幾行代碼。
但將λ表達式引入Java的動機並不只僅爲此。
Java8有一個短時間目標和一個長期目標。
短時間目標是:配合「集合類批處理操做」的內部迭代(脫離於客戶代碼)和並行處理(更高效地利用現代CPU);
長期目標是將Java向函數式編程語言這個方向引導
並非要徹底變成一門函數式編程語言,只是讓它有更多的函數式編程語言的特性,
也正是因爲這個緣由,Oracle並無簡單地使用內部類去實現λ表達式,而是使用了一種更動態、更靈活、易於未來擴展和改變的策略。