Lambda表達式詳解

定義:Lambda表達式可以理解爲簡潔地表示可傳遞的匿名函數的一種方式:它沒有名稱、有參數列表、函數主體、返回類型、可能還會有一個可以拋出的異常列表。

1 詳細解釋

  • 1 匿名:因爲它不像普通方法那樣有一個明確名稱。
  • 2 函數:因爲它不屬於某個特定的類,但是和方法一樣有參數列表、函數主體、返回類型、可能還會有一個可以拋出的異常列表。
  • 3 傳遞:Lambda表達式可以作爲參數傳遞給方法或存儲在變量中。
  • 4 簡潔:無需像匿名類那樣寫很多模板代碼。

2 Lambda表達式使用demo

public class Demo {

    public static void main(String[] args) {
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer integer1, Integer integer2) {
                return integer1.compareTo(integer2);
            }
        };


        Comparator<Integer> comparatorWithLambda = (Integer integer1,Integer integer2) -> integer1.compareTo(integer2);
    }
}

總結:同樣是實現一個比較器,如果用匿名內部類代碼量比較大,用Lambda表達只需要一行代碼就可以解決

2 lambda表達式語法

具體語法(parameters) -> expression 或者 (parameters) -> {statements}

使用例子:

   // 參數爲一個list  判斷它是否爲空並返回boolean值
   (List<String> list) -> list.isEmpty()
   
   // 返回一個List對象
   () -> new ArrayList<String>(10)
   
   //參數爲兩個整型計算他們的和並返回
   (int a, int b) -> a * b
   
   //顯示返回10
   () -> {return 10;}

3 Java中在哪裏使用Lambda表達式

<1>函數式接口中使用: java中函數式接口是指只定義一個抽象方法的接口

    //java存在很多的函數式接口,Runnable就是
    public class Demo2 {
        public static void init(Runnable runnable) {
            runnable.run();
        }
    
        public static void main(String[] args) {
    
            Runnable r1 = new Runnable() {
                @Override
                public void run() {
                    System.out.println("thread1");
                }
            };
    
            Runnable r2 = () -> System.out.println("thread2");
    
            init(r1);
            init(r2);
            init(() -> System.out.println("thread3"));
        }
    }

4 自定義函數式接口並且使用lambda表達式傳遞行爲

      //功能,連續讀取一個文件的兩行內容
      
      //定義一個函數式接口,用來返回文件內容
      @FunctionalInterface
      public interface BufferedReaderProcessor {
          String process(BufferedReader bufferedReader) throws IOException;
      }
      
      //將函數式接口BufferedReaderProcessor 作爲處理文件方法的參數以此可以使用lambda表達式傳遞行爲
      public class ProcessFile {
    
        public static String processFile(BufferedReaderProcessor processor) throws IOException {
            try (BufferedReader br = new BufferedReader(new FileReader("D:\\Pragram Files\\IdeaProjects\\javase\\src\\main\\java\\Java8\\chapter2_lambda\\lambda.txt"))) {
                return processor.process(br);
            }
        }
    
    
        public static void main(String[] args) throws IOException{
            String line = processFile((BufferedReader br) -> br.readLine()+br.readLine());
    
            System.out.println(line);
           }
       }
       
       結果:
       lambda -> great!lambda -> great2!

總結:這裏自己實現實現了一個函數式接口,然後通過lambda表達式傳遞讀取文件的行爲。可以很容易並且簡單地控制讀取的行數。

5 結合方法引用和lambda表達式(最終案例==>推薦)

  • 使用場景:比較存放在List中的Apple的重量大小
     //Apple類
     public class Apple {

        private Double weight;
    
        public Double getWeight() {
            return weight;
        }
    
        public void setWeight(Double weight) {
            this.weight = weight;
        }
    }
    
    
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import static java.util.Comparator.*;
public class AppleCompare {

    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>();
        //向List中放入四個蘋果
        apples.add(new Apple(0.5));
        apples.add(new Apple(0.3));
        apples.add(new Apple(0.8));
        apples.add(new Apple(0.6));


        //比較重量 List提供了sort方法 public void sort(Comparator<? super E> c)接收一個函數表達式

        // java8之前的做法 使用匿名內部類
//        apples.sort(new Comparator<Apple>() {
//            @Override
//            public int compare(Apple o1, Apple o2) {
//                return o1.getWeight().compareTo(o2.getWeight());
//            }
//        });
//
//        System.out.println(apples);

        //java8中使用lambda表達式和方法調用是最好的實踐策略

        //這邊使用了lambda表達式
//        apples.sort((a1,a2)-> a1.getWeight().compareTo(a2.getWeight()));
//        System.out.println(apples);

        //最終版使用lambda表達式和方法調用 Comparator提供了comparing靜態方法比較元素。
        apples.sort(comparing(Apple::getWeight));


    }

}

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