Java 8十個lambda表達式案例

Java 8十個lambda表達式案例

  1. 實現Runnable線程案例

使用() -> {} 替代匿名類:

//Before Java 8:new Thread(new Runnable() {    @Override
    public void run() {
        System.out.println("Before Java8 ");
    }
}).start();//Java 8 way:new Thread( () -> System.out.println("In Java8!") ).start();     
Output:too much code, for too little to doLambda expression rocks !!

你可以使用 下面語法實現Lambda:

(params) -> expression
(params) -> statement
(params) -> { statements }

如果你的方法並不改變任何方法參數,比如只是輸出,那麼可以簡寫如下:

() -> System.out.println("Hello Lambda Expressions");

如果你的方法接受兩個方法參數,如下:

(int even, int odd) -> even + odd

2.實現事件處理

如果你曾經做過Swing 編程,你將永遠不會忘記編寫事件偵聽器代碼。使用lambda表達式如下所示寫出更好的事件偵聽器的代碼。

// Before Java 8:JButton show =  new JButton("Show");
show.addActionListener(new ActionListener() {     @Override
     public void actionPerformed(ActionEvent e) {
           System.out.println("without lambda expression is boring");
        }
     });// Java 8 way:show.addActionListener((e) -> {
    System.out.println("Action !! Lambda expressions Rocks");
});

在java 8中你可以使用Lambda表達式替代醜陋的匿名類。

 

3.使用Lambda表達式遍歷List集合

 features  .asList(, , 
, ); ( feature  ) {   .out.println(feature);
} features  .asList(, , ,
 );
features.forEach(n -> .out.println(n));features.forEach(.out::println);   and

方法引用是使用兩個冒號::這個操作符號。

4.使用Lambda表達式和函數接口

爲了支持函數編程,Java 8加入了一個新的包java.util.function,其中有一個接口java.util.function.Predicate是支持Lambda函數編程:

   (args[]){
  List languages = Arrays.(, , , , );

  System..();
  filter(languages, (str)->str.());

  System..();
  filter(languages, (str)->str.());

  System..();
  filter(languages, (str)->);

   System..();
   filter(languages, (str)->);

   System..();
   filter(languages, (str)->str.() > );
}    (List names, Predicate condition) {    (String  names)  {       (condition.(name)) {
          System..(name + );
       }
    }
  }
}Languages which starts with J :
Java
Languages which ends with a
Java
Scala
Print all languages :
Java
Scala
C++
Haskell
Lisp
Print no language :
Print language whose length greater than :
Scala
Haskell
    (List names, Predicate condition) {
    names.().((name) -> (condition.(name)))
        .((name) -> {System..(name + );
    });
 }

你能看到來自Stream API 的filter方法能夠接受 Predicate參數, 能夠允許測試多個條件。


5.複雜的結合Predicate 使用

java.util.function.Predicate提供and(), or() 和 xor()可以進行邏輯操作,比如爲了得到一串字符串中以"J"開頭的4個長度:

 
 
 <> startsWithJ  (n) -> n.startsWith(); <> fourLetterLong  (n) -> n.length() == ;
   
 names.stream()
      .filter(startsWithJ.(fourLetterLong))
      .forEach((n) -> .out.print( + n));

其中startsWithJ.and(fourLetterLong)是使用了AND邏輯操作。

 

6.使用Lambda實現Map 和 Reduce

最流行的函數編程概念是map,它允許你改變你的對象,在這個案例中,我們將costBeforeTeax集合中每個元素改變了增加一定的數值,我們將Lambda表達式 x -> x*x傳送map()方法,這將應用到stream中所有元素。然後我們使用 forEach() 打印出這個集合的元素.

 costBeforeTax  .asList(, , , , ); ( cost  ) {
      double price  cost + .*cost;      .out.println(price);
} costBeforeTax  .asList(, , , , );
costBeforeTax.stream().map((cost) -> cost + .*cost)
                      .forEach(.out::println);

reduce() 是將集合中所有值結合進一個,Reduce類似SQL語句中的sum(), avg() 或count(), 

// Applying 12% VAT on each purchase// Old way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double total = 0;for (Integer cost : costBeforeTax) {
 double price = cost + .12*cost;
 total = total + price;
 
}System.out.println("Total : " + total);// New way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost)
                                   .reduce((sum, cost) -> sum + cost)
                                   .get();
System.out.println("Total : " + bill);OutputTotal : 1680.0Total : 1680.0

 

7.通過filtering 創建一個字符串String的集合

Filtering是對大型Collection操作的一個通用操作,Stream提供filter()方法,接受一個Predicate對象,意味着你能傳送lambda表達式作爲一個過濾邏輯進入這個方法:

<> filtered  strList.stream().filter(x -> x.length()> )
                                        .collect(.toList());.out.printf(, 
                  strList, filtered);    [, , , , , ], filtered list  , bcd, defg

 

8.對集合中每個元素應用函數

我們經常需要對集合中元素運用一定的功能,如表中的每個元素乘以或除以一個值等等.

<> G7  .asList(, , , , , ,); G7Countries  G7.stream().map(x -> x.toUpperCase())
                                .collect(.joining());.out.println(G7Countries);  , , , , , U.K.,

上面是將字符串轉換爲大寫,然後使用逗號串起來。

 

9.通過複製不同的值創建一個子列表

使用Stream的distinct()方法過濾集合中重複元素。

<> numbers  .asList(, , , , , , );<> distinct  numbers.stream().map( i -> i*i).distinct()
                                         .collect(.toList());.out.printf(, numbers, distinct);    [, , , , , , ],    
                                         duplicates  , , , ,

 

10.計算List中的元素的最大值,最小值,總和及平均值

<> primes  .asList(, , , , , , , , , ); stats  primes.stream().mapToInt((x) -> x)
                                            .summaryStatistics();.out.println( + stats.getMax());.out.println( + stats.getMin());.out.println( + stats.getSum());.out.println( + stats.getAverage());


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章