JDK1.8 之Lambda


Lambda 理解的了很久才有一點小感覺。

語法

lambda表達式的特點,它的語法如下面。

parameter -> expression body

下面是一個lambda表達式的重要特征。

  • 可選類型聲明 - 無需聲明參數的類型。編譯器可以從該參數的值推斷。

  • 可選圓括號參數 - 無需在括號中聲明參數。對於多個參數,括號是必需的。

  • 可選大括號 - 表達式主體沒有必要使用大括號,如果主體中含有一個單獨的語句。

  • 可選return關鍵字 - 編譯器會自動返回值,如果主體有一個表達式返回的值。花括號是必需的,以表明表達式返回一個值。

 

變量作用域:

  在lambda表達式,可以指任何最終的變量或有效的最后一個變量(被分配一次)。如果變量被二次賦值,lambda表達式將拋出編譯錯誤。

一、使用線程

public static void main(String[] args) {
        //=============================原始版==========================
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("簡單的線程編程JDK1.8以前");
            }
        }).start();
        //=====================Lambda可讀性強一些================================
        new Thread(()->{System.out.println("Lambda可讀性強一些");}).start();
        //=====================Lambda簡潔一些================================
        new Thread(()->System.out.println("Lambda簡潔一些")).start();
    }

 

Runnable接口源碼:

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

  該接口只有一個抽象方法,且該抽象沒有參數 所以Lambda 表達式為 ();   System.out.println("簡單的線程編程JDK1.8") 是實現該接口覆蓋run方法的具體實現邏輯。所以最終Runnable接口的最終實現代碼用Lambda表達式實現為:() -> System.out.println("簡單的線程編程JDK1.8")。

 二、使用  Collections.sort 排序

    public static void testComparatorLambda(){
        List<Integer> names = Arrays.asList(1, 10, 3, 2,1);
        //=========================創建一個匿名的比較器對象=====================
        Collections.sort(names, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
                return o1.compareTo(o2);
            }
        });
        //==========================使用Lambda=================================
        Collections.sort(names,(Integer o1,Integer o2)->{
                        System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));
                        return o1.compareTo(o2);
                      } );
        System.err.println(names);
    }
@FunctionalInterface
public interface Comparator<T> {
  int compare(T o1, T o2);
}

  Compoarator接口的compare方法有兩個參數 所以Lambda 表達式為 (Integer o1,Integer o2);   {System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2));return o1.compareTo(o2);} 是實現該接口覆蓋compare方法的具體實現邏輯。所以最終Compoarator接口的最終實現代碼用Lambda表達式實現為:(Integer o1,Integer o2)->{ System.out.println("o1:"+o1+"<>o2:"+o2+"=="+o1.compareTo(o2)); return o1.compareTo(o2);} 

三、自己模擬業務使用Lambda表達式實現

業務:從一堆蘋果中選出紅色的蘋果。

建立一個蘋果類

class Apple{
    private String color;
    private Integer weight;
    構造函數
    get,set
}    

一個策略接口

interface AppleFilter{
    boolean validate(Apple apple);
}

業務實現:

public class LambdaAgo {
    public static void main(String[] args) {
        List<Apple> apples=Arrays.asList(new Apple("red",120),new Apple("green",189),new Apple("red",110));
        //===方法一 使用內部類======
        getAppleFilter(apples,new AppleFilter() {
            @Override
            public boolean validate(Apple apple) {
                return apple.getColor().equals("red");
            }
        });
        //===方法二 使用 Lambda======
        getAppleFilter(apples,(Apple apple)-> apple.getColor().equals("red"));
    
    }
    public static List<Apple> getAppleFilter(List<Apple> apples,AppleFilter filter){
        List<Apple> apples2=new ArrayList<Apple>();
        for(Apple a:apples){
            if(filter.validate(a)){
                apples2.add(a);
            }
        }
        System.out.println("getAppleFilter:"+apples2);
        return apples2;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM