Java8出來已經4年,但仍是有不少人用上了jdk8,但並沒用到裏面的新東西,那不就等於沒用?jdk8有許多的新特性,詳細可看下面腦圖html
我只講兩個最重要的特性Lambda和Stram,配合起來用能夠極大提升生產力,寫出高效率、乾淨、簡潔的代碼。java
Lambda 容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中)。express
lambda 表達式的語法格式以下:數組
(parameters) -> expression或(parameters) ->{ statements; }
下面是Java lambda表達式的簡單例子:安全
// 1. 不須要參數,返回值爲 5 () -> 5 // 2. 接收一個參數(數字類型),返回其2倍的值 x -> 2 * x // 3. 接受2個參數(數字),並返回他們的差值 (x, y) -> x – y // 4. 接收2個int型整數,返回他們的和 (int x, int y) -> x + y // 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void) (String s) -> System.out.print(s)
String[] atp = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka", "David Ferrer","Roger Federer", "Andy Murray","Tomas Berdych", "Juan Martin Del Potro"}; List<String> players = Arrays.asList(atp); // Java 8以前: for (String player : players) { System.out.print(player + "; "); } // Java 8:使用 lambda 表達式以及函數操做(functional operation) players.forEach((player) -> System.out.print(player + "; ")); // 在 Java 8 中使用雙冒號操做符(double colon operator) players.forEach(System.out::println);
// Java 8以前: new Thread(new Runnable() { @Override public void run() { System.out.println("Hello world !"); } }).start(); // Java 8方式: new Thread(() -> System.out.println("Hello world !")).start(); // Java 8以前: Runnable race1 = new Runnable() { @Override public void run() { System.out.println("Hello world !"); } }; // Java 8方式: Runnable race2 = () -> System.out.println("Hello world !"); // 直接調用 run 方法 race1.run(); race2.run();
String[] players = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka", "David Ferrer", "Roger Federer", "Andy Murray", "Tomas Berdych", "Juan Martin Del Potro", "Richard Gasquet", "John Isner"}; // Java 8以前: Arrays.sort(players, new Comparator<String>() { @Override public int compare(String s1, String s2) { return (s1.compareTo(s2)); } }); // Java 8方式: Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2)); Arrays.sort(players, sortByName); // Java 8方式:另外一種形式 Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));
stream的定義是什麼?一個簡單的定義是:"對一個源中的一系列元素進行聚合操做。"
使用Stream,能夠像SQL同樣操做數據。
可操做的數據有集合,數組,I/O channel, 產生器generator 等。dom
Sream的主要使用方式ide
'forEach' 來迭代流中的每一個數據。如下代碼片斷使用 forEach 輸出了10個隨機數:函數
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
map 方法用於映射每一個元素到對應的結果,如下代碼片斷使用 map 輸出了元素對應的平方數:學習
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 獲取對應的平方數並去重 List<Integer> squaresList = numbers.stream().map( i -> i*i) .distinct().collect(Collectors.toList());
filter 方法用於經過設置的條件過濾出元素。如下代碼片斷使用 filter 方法過濾出空字符串:spa
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 獲取空字符串的數量 int count = strings.stream().filter(string -> string.isEmpty()).count();
limit 方法用於獲取指定數量的流。 如下代碼片斷使用 limit 方法打印出 10 條數據:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
sorted 方法用於對流進行排序。如下代碼片斷使用 sorted 方法對輸出的 10 個隨機數進行排序:
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
parallelStream 是流並行處理程序的代替方法。如下實例咱們使用 parallelStream 來輸出空字符串的數量:
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 獲取空字符串的數量 int count = strings.parallelStream().filter(string -> string.isEmpty()).count();
ParallelStream和Stream的區別就是支持並行執行,提升程序運行效率。可是若是使用不當可能會發生線程安全的問題,慎用
Collectors 類實現了不少歸約操做,例如將流轉換成集合和聚合元素。Collectors 可用於返回列表或字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()) .collect(Collectors.toList()); System.out.println("篩選列表: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()) .collect(Collectors.joining(", ")); System.out.println("合併字符串: " + mergedString);
另外,一些產生統計結果的收集器也很是有用。它們主要用於int、double、long等基本類型上,它們能夠用來產生相似以下的統計結果。
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x) .summaryStatistics(); System.out.println("列表中最大的數 : " + stats.getMax()); System.out.println("列表中最小的數 : " + stats.getMin()); System.out.println("全部數之和 : " + stats.getSum()); System.out.println("平均數 : " + stats.getAverage());
還沒學會的同窗趕忙動動手,學起來!會用以後,能大大提升效率哦!
參考:
https://blog.csdn.net/renfufe...
http://www.runoob.com/java/ja...
http://www.importnew.com/1643...
堅持日更:34天
您的點贊、轉發是對我最大的支持!
THANDKS
一個立志成大腿而天天努力奮鬥的年輕人
伴學習伴成長,成長之路你並不孤單!
![掃描二維碼,關注公衆號
](http://upload-images.jianshu....