java8新特性Lambda和Stream

Java8出來已經4年,但仍是有不少人用上了jdk8,但並沒用到裏面的新東西,那不就等於沒用?jdk8有許多的新特性,詳細可看下面腦圖html

image

我只講兩個最重要的特性Lambda和Stram,配合起來用能夠極大提升生產力,寫出高效率、乾淨、簡潔的代碼。java

1、Lambda表達式

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)

Lambda怎麼用

1. for循環遍歷

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);

2. 代替匿名內部類

(1) lambdas 實現 Runnable 接口
// 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();
(2) lambda進行集合排序
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)));

2、Stream

stream的定義是什麼?一個簡單的定義是:"對一個源中的一系列元素進行聚合操做。"
使用Stream,能夠像SQL同樣操做數據。
可操做的數據有集合,數組,I/O channel, 產生器generator 等。dom

Sream的主要使用方式ide

1. forEach

'forEach' 來迭代流中的每一個數據。如下代碼片斷使用 forEach 輸出了10個隨機數:函數

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

2. map

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());

3. filter

filter 方法用於經過設置的條件過濾出元素。如下代碼片斷使用 filter 方法過濾出空字符串:spa

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 獲取空字符串的數量
int count = strings.stream().filter(string -> string.isEmpty()).count();

4. limit

limit 方法用於獲取指定數量的流。 如下代碼片斷使用 limit 方法打印出 10 條數據:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

5. sorted

sorted 方法用於對流進行排序。如下代碼片斷使用 sorted 方法對輸出的 10 個隨機數進行排序:

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

6. 並行(parallel)程序

parallelStream 是流並行處理程序的代替方法。如下實例咱們使用 parallelStream 來輸出空字符串的數量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 獲取空字符串的數量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

ParallelStream和Stream的區別就是支持並行執行,提升程序運行效率。可是若是使用不當可能會發生線程安全的問題,慎用

7. Collectors

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);

8. 統計

另外,一些產生統計結果的收集器也很是有用。它們主要用於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天

您的點贊、轉發是對我最大的支持!

image

image

 THANDKS

  • End -

一個立志成大腿而天天努力奮鬥的年輕人

伴學習伴成長,成長之路你並不孤單!

![掃描二維碼,關注公衆號
](http://upload-images.jianshu....

相關文章
相關標籤/搜索