34.Lambda表達(dá)式:簡(jiǎn)化規(guī)則&常見應(yīng)用

Lambda表達(dá)式

Lambda概述

  • Lambda表達(dá)式是JDK8開始后的一種新的語(yǔ)法形式

  • 作用:簡(jiǎn)化匿名內(nèi)部類的代碼寫法

  • Lambda表達(dá)式的簡(jiǎn)化格式

    (匿名內(nèi)部類被重寫的形參列表)->{
        被重寫方法的方法體代碼
    }
    
  • 注意:Lambda表達(dá)式只能簡(jiǎn)化函數(shù)式接口的匿名內(nèi)部類的寫法形式

  • 函數(shù)式接口

    • 首先必須是接口,其次接口中有且僅有一個(gè)抽象方法的形式

    • 通常在接口上方加上一個(gè)@FunctionnallInterface注解,標(biāo)記該接口必須是滿足函數(shù)式接口

    • 錯(cuò)誤示范

      package com.java.lambda_test;
      
      public class LambdaDemo1 {
          public static void main(String[] args) {
              // 目標(biāo):學(xué)會(huì)使用Lambda的標(biāo)準(zhǔn)格式簡(jiǎn)化匿名內(nèi)部類的代碼形式
              Animal a = new Animal() {
                  @Override
                  public void run() {
                      System.out.println("烏龜跑的很慢~~~~~");
                  }
              };
              a.run();
      
              // 注意:lambda并不是可以簡(jiǎn)化所有匿名匿名內(nèi)部類形式??!
      //        Animal a1 = () -> {
      //            System.out.println("烏龜跑的很慢~~~~~");
      //        };
      //        a1.run();
          }
      }
      
      
      
      abstract class Animal{
          public abstract void run();
      }
      
  • 測(cè)試代碼

    package com.java.lambda_test;
    
    public class LambdaDemo2 {
        public static void main(String[] args) {
            // 目標(biāo):學(xué)會(huì)使用Lambda的標(biāo)準(zhǔn)格式簡(jiǎn)化匿名內(nèi)部類的代碼形式
            // 注意:Lambda只能簡(jiǎn)化接口中只有一個(gè)抽象方法的匿名內(nèi)部類形式(函數(shù)式接口)
    
            // 1. 匿名內(nèi)部類原始寫法
      /*
            Swimming s1 = new Swimming() {
                @Override
                public void swim() {
                    System.out.println("老師游泳賊溜~~~~~");
                }
            }
            Swimming s1 = () -> {
                System.out.println("老師游泳賊溜~~~~~");
            };
    
       */
    
            // 2.Lambda簡(jiǎn)化格式
            Swimming s1 = () -> System.out.println("老師游泳賊溜~~~~~");
            go(s1);
    
            
            
            System.out.println("---------------------");
     /*
            go(new Swimming() {
                @Override
                public void swim() {
                    System.out.println("學(xué)生游泳很開心~~~");
                }
            })
            go(() ->{
                    System.out.println("學(xué)生游泳很開心~~~");
            });
    
      */
    
            // 2.1 Lambda表達(dá)式中重寫方法作為參數(shù)傳遞以簡(jiǎn)化格式
            go(() -> System.out.println("學(xué)生游泳很開心~~~"));
    
    
        }
    
        public static void go(Swimming s) {
            System.out.println("開始。。。");
            s.swim();
            System.out.println("結(jié)束。。。");
        }
    }
    
    @FunctionalInterface // 一旦加上這個(gè)注解必須是函數(shù)式接口,里面只能有一個(gè)抽象方法
    interface Swimming {
        void swim();
    }
    
    

Lambda簡(jiǎn)化常見函數(shù)接口

Lambda表達(dá)式簡(jiǎn)化Comparator接口的匿名形式

image.png

Lambda表達(dá)式簡(jiǎn)化按鈕監(jiān)聽器ActionListener的匿名內(nèi)部類形式

image.png

綜合測(cè)試代碼

package com.java.lambda_test;

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

public class LambdaDemo3 {
    public static void main(String[] args) {
        Integer[] ages1 = {34, 12, 42, 23};
        /**
         參數(shù)一:被排序的數(shù)組 必須是引用類型的元素
         參數(shù)二:匿名內(nèi)部類對(duì)象,代表了一個(gè)比較器對(duì)象。
         */
//        Arrays.sort(ages1, new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1; //  降序
//            }
//        });

//        Arrays.sort(ages1, (Integer o1, Integer o2) -> {
//                return o2 - o1; //  降序
//        });


//        Arrays.sort(ages1, ( o1,  o2) -> {
//            return o2 - o1; //  降序
//        });

        Arrays.sort(ages1, ( o1,  o2 ) ->  o2 - o1 );

        System.out.println(Arrays.toString(ages1));

        System.out.println("---------------------------");
        JFrame win = new JFrame("登錄界面");
        JButton btn = new JButton("我是一個(gè)很大的按鈕");
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
//            }
//        });

//        btn.addActionListener((ActionEvent e) -> {
//                System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
//        });

//        btn.addActionListener(( e) -> {
//            System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
//        });

//        btn.addActionListener( e -> {
//            System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!");
//        });

        btn.addActionListener( e -> System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!") );



        win.add(btn);
        win.setSize(400, 300);
        win.setVisible(true);
    }
}

Lambda表達(dá)式的省略規(guī)則

Lambda表達(dá)式的省略寫法

進(jìn)一步在Lambda表達(dá)式的基礎(chǔ)上繼續(xù)簡(jiǎn)化

  • 參數(shù)類型可以省略不寫
  • 如果只有一個(gè)參數(shù),參數(shù)類型可以省略,同時(shí)括號(hào)()也可以省略
  • 如果Lambda表達(dá)式的方法體代碼只有一行代碼,可以省略大括號(hào)不寫,同時(shí)要省略分號(hào)
  • 如果Lambda表達(dá)式的方法體代碼只有一行代碼,可以省略大括號(hào)不寫,此時(shí)
    如果該行代碼是return語(yǔ)句,則必須省略return不寫,同時(shí)也必須省略分號(hào):不寫

測(cè)試代碼

package com.java.lambda_test;

import javax.swing.*;
import java.util.Arrays;

public class LambdaDemo3 {
    public static void main(String[] args) {
        Integer[] ages1 = {34, 12, 42, 23};
        /**
         參數(shù)一:被排序的數(shù)組 必須是引用類型的元素
         參數(shù)二:匿名內(nèi)部類對(duì)象,代表了一個(gè)比較器對(duì)象。
         */
        
//      簡(jiǎn)化規(guī)則1 2
        
//        Arrays.sort(ages1, new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1; //  降序
//            }
//        });

//        Arrays.sort(ages1, (Integer o1, Integer o2) -> {
//                return o2 - o1; //  降序
//        });


//        簡(jiǎn)化規(guī)則4
//        Arrays.sort(ages1, ( o1,  o2) -> {
//            return o2 - o1; //  降序
//        });

        Arrays.sort(ages1, (o1, o2) -> o2 - o1);    // 兩個(gè)參數(shù)不能省略

        
        
        System.out.println(Arrays.toString(ages1));

        System.out.println("---------------------------");
        JFrame win = new JFrame("登錄界面");
        JButton btn = new JButton("我是一個(gè)很大的按鈕");
        
        
//       簡(jiǎn)化規(guī)則3
//        btn.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
//            }
//        });

//        btn.addActionListener((ActionEvent e) -> {
//                System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我?。?);
//        });

//        btn.addActionListener(( e) -> {
//            System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我??!");
//        });

//        btn.addActionListener( e -> {
//            System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!");
//        });

        btn.addActionListener(e -> System.out.println("有人點(diǎn)我,點(diǎn)我,點(diǎn)我!!"));


        win.add(btn);
        win.setSize(400, 300);
        win.setVisible(true);
    }
}

極其優(yōu)雅的降序:Arrays.sort(ages1, (o1, o2) -> o2 - o1);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容