1. 程式人生 > 其它 >Day38:Lambda表示式

Day38:Lambda表示式

Lambda表示式

1.1 概述

LambdaJDK8開始後的一種新語法形式。

作用:簡化函式式匿名內部類的程式碼寫法。

簡化格式:

/*部類被重寫方法的引數)->{
    被重寫方法的方法體程式碼
}
->為語法格式,無任何含義
*/

注意:

  • Lambda表示式只能簡化函式式介面的匿名內部類

那什麼是函式式介面?

首先必須是介面、其次要求介面內只有一個抽象方法

有什麼好處呢?

簡化程式碼,提升語言表達能力。

1.2 Lambda表示式簡化初體驗

public class LambdaDemo {
    public static void main(String[] args) {
        //學習如何使用Lambda表示式               Lamdbda只能簡化  函式式介面的匿名內部類
        
        
//第一步:先建立函式式匿名內部類
             /*
             Animals a=new Animals() {//用多型的方式接收它
             @Override
             public void run() {
                System.out.println("喵喵在奔跑");
             }//必須重寫所有抽象方法

             };//匿名內部類本質其實是一個繼承類的子類物件或者是介面的實現類物件,
             */

//第二步:簡化匿名內部類
        Animals a=() ->{System.out.println("喵喵在奔跑");};
        go(a);//方法在下面
        
        System.out.println("=================================");
        
//第三步:繼續簡化
          //匿名內部類是可以作參的
           /*go(new Animals() {
            @Override
            public void run() {
                System.out.println("喵喵在奔跑");
            }
        });
            */
        go(() ->{System.out.println("喵喵在奔跑");});
    }

    //函式式介面   
    @FunctionalInterface//我們可以在介面上加一個註釋:@FunctionalInterface 這樣約束介面必須是函式式
    interface Animals{//要求是介面
        void run();//只含有一個抽象方法
    }
    //介面實現類物件作參的方法
    public static void go(Animals a){
        System.out.println("開始奔跑");
        a.run();
        System.out.println("結束奔跑");
    }
}

開始奔跑
喵喵在奔跑
結束奔跑
=================================
開始奔跑
喵喵在奔跑
結束奔跑

1.3 實戰簡化

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;

public class LambdaDemo01 {
    public static void main(String[] args) {
        //建立一個數組
        Integer[] a={10,2,5,22,543,1};
        //自定義排序方法使之降序
           /*Arrays.sort(a, new Comparator<Integer>() {//我們發現這個比較器就是一個函式式匿名內部類
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });
        System.out.println(Arrays.toString(a));
            */
        //簡化上面程式碼
        Arrays.sort(a,(Integer o1, Integer o2) ->{return o1-o2;});

        System.out.println("===================================");
        JFrame win = new JFrame("登入介面");//建立視窗
        JButton btn=new JButton("我是按鈕");//建立按鈕
        win.setSize(400,300);
        win.setVisible(true);
        win.add(btn);
        btn.addActionListener(new ActionListener() {//繫結一個監聽器
            @Override//這是一個函式式匿名內部類
            public void actionPerformed(ActionEvent e) {
                System.out.println("有人點我喲");
            }
        });
        //簡化上面的函式式匿名內部類
        /*
        btn.addActionListener((ActionEvent e) ->{System.out.println("有人點我喲");});
         */
    }
}

1.4 Lambda表示式的省略規則

建立在Lambda表示式的基礎上繼續簡化

  • 引數型別可以省略不寫
  • 如果只有一個引數,引數型別可以不寫,同時()也可以省略
  • 如果Lambda表示式的方法體程式碼只有一行程式碼,則可以省略大括號不寫,但同時要省略分號
  • 如果Lambda表示式的方法體程式碼只有一行程式碼,則可以省略大括號不寫,與此同時,此程式碼是return語句,必須省略return,同時也要省略分號

我們把上面實戰的程式碼進行簡化:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;

public class LambdaDemo02 {
    public static void main(String[] args) {
        //建立一個數組
        Integer[] a={10,2,5,22,543,1};
        //自定義排序方法使之降序
           /*Arrays.sort(a, new Comparator<Integer>() {//我們發現這個比較器就是一個函式式匿名內部類
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });
        System.out.println(Arrays.toString(a));
            */
        //簡化上面程式碼
        //Arrays.sort(a,(Integer o1, Integer o2) ->{return o1-o2;});
        //進一步簡化  引數型別可以省略不寫
        //Arrays.sort(a,(o1,o2) ->{return o1-o2;});
        //再進一步簡化   如果Lambda表示式的方法體程式碼只有一行程式碼,則可以省略大括號不寫,與此同時,此程式碼是return語句,必須省略return,同時也要省略分號
        Arrays.sort(a,(o1,o2) -> o1-o2);

        System.out.println("===================================");
        JFrame win = new JFrame("登入介面");//建立視窗
        JButton btn=new JButton("我是按鈕");//建立按鈕
        win.setSize(400,300);
        win.setVisible(true);
        win.add(btn);
        /*
        btn.addActionListener(new ActionListener() {//繫結一個監聽器
            @Override//這是一個函式式匿名內部類
            public void actionPerformed(ActionEvent e) {
                System.out.println("有人點我喲");
            }
        });

         */

        //簡化上面的函式式匿名內部類
        /*
        btn.addActionListener((ActionEvent e) ->{System.out.println("有人點我喲");});
         */
        //進一步簡化  如果Lambda表示式的方法體程式碼只有一行程式碼,則可以省略大括號不寫,但同時要省略分號
        btn.addActionListener( e->System.out.println("有人點我喲"));
    }
}