JAVA8新特性之Lambda表達式

作為語法糖,其實現(xiàn)邏輯分為三步:

第一步:有一個函數(shù)式接口(創(chuàng)建一個接口,包含一個未實現(xiàn)的方法);
第二步:有一個方法A,將接口作為A的形參;
第三步:顯示調(diào)用方法A,Lambda表達式作為實參代替第二步的形參,既完成了接口調(diào)用。

LAMBDA表達式需要函數(shù)式接口支持

格式:

1. Lambda表達式的操作符: ->
2. 操作符左側(cè):表達式參數(shù)列表;
    操作符右邊:需要執(zhí)行的功能;
3. 參數(shù)列表,沒有參數(shù)的時候,小括號不能省略,有一個參數(shù)的時候,可以省略,如果有多個,小括號不能省略;
4. 參數(shù)列表中參數(shù)類型可以省略,Java會自動判斷;
5. 操作符右側(cè),方法體有多條需要用大括號{}包圍;
6. 操作符右側(cè),只有一條語句的時候,return和大括號都可以省略;

代碼??

package com.learn.noel.jdk8feature;

import org.junit.Test;

/**
 * @Description
 * @Author noel
 * @Date 2021/12/28
 * Version 1.0
 **/
public class Jdk8FeatureApplication {
    //將給定字符串轉(zhuǎn)為大寫字符串
    @Test
    public void converter(){
        //調(diào)用Ⅱ的字符串處理方法,lambda表達式才是接口方法的具體實現(xiàn)
        String result = strHandler("ssass",(str)->str.toUpperCase());//Ⅰ
        System.out.println(result);
    }
    //Ⅱ 
    //定義字符串處理方法,具體實現(xiàn)由調(diào)用的時候決定
    public String strHandler(String str, dealString handler){
        return handler.getValue(str);//調(diào)用Ⅲ中接口的方法,并未實現(xiàn)該方法
    }
}

package com.learn.noel.jdk8feature;

/**
 * @Description
 * @Author noel
 * @Date 2021/12/28
 * Version 1.0
 **/
//Ⅲ
@FunctionalInterface
public interface dealString {
    public String getValue(String s);
}

如果不這樣寫,可能會:

1、創(chuàng)建一個類,實現(xiàn)上面的dealString接口;
2、然后實例化上一步創(chuàng)建的類,實現(xiàn)該方法,這個案例是實現(xiàn)小寫全部轉(zhuǎn)換為大寫的功能;
3、通過實例化方法使用小寫轉(zhuǎn)大寫功能;
4、如果有其他字符串處理功能需要實現(xiàn),有多少個功能就需要實現(xiàn)多少個對應(yīng)的類和方法,造成代碼冗余;

上面執(zhí)行完成后,等同于:

String getValue(String s){
    return s.toUpperCase();
}

再舉個??,使用JAVA自帶的幾何類實現(xiàn)內(nèi)容比較:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public List<Employee> employees = Arrays.asList(
            new Employee(101,18,"張三", 9999.99),
            new Employee(102,59,"理司", 3333.4),
            new Employee(103,18,"王五", 7777.7),
            new Employee(104,8,"趙六", 6665.3),
            new Employee(105,38,"天切", 5555)
    );

    @Test
    public void compare(){
        //如果員工年齡相等則使用姓名按字典順序排序,最后輸出排序結(jié)果
        Collections.sort(employees,(e1, e2)->{
            int result = (e1.getAge()==e2.getAge())? e1.getName().compareTo(e2.getName()):Integer.compare(e1.getAge(),e2.getAge());
            return result;
        });
        for(Employee employee:employees){
            System.out.println(employee);
        }
    }

Collections類有一個排序方法,其方法簽名如下:

 public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

sort方法的第二個參數(shù),是一個接口Comparator,該接口有個compare方法:

int compare(T o1, T o2);

sort方法的實現(xiàn):

default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

Employee代碼:

package com.learn.noel.jdk8feature;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Description
 * @Author noel
 * @Date 2021/12/28
 * Version 1.0
 **/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Employee {

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

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

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