Lambda 理解的了好久纔有一點小感受。express
lambda表達式的特色,它的語法以下面。編程
parameter -> expression body
下面是一個lambda表達式的重要特徵。app
可選類型聲明 - 無需聲明參數的類型。編譯器能夠從該參數的值推斷。ide
可選圓括號參數 - 無需在括號中聲明參數。對於多個參數,括號是必需的。函數
可選大括號 - 表達式主體沒有必要使用大括號,若是主體中含有一個單獨的語句。spa
可選return關鍵字 - 編譯器會自動返回值,若是主體有一個表達式返回的值。花括號是必需的,以代表表達式返回一個值。線程
變量做用域:code
在lambda表達式,能夠指任何最終的變量或有效的最後一個變量(被分配一次)。若是變量被二次賦值,lambda表達式將拋出編譯錯誤。對象
1、使用線程blog
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")。
2、使用 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);}
3、本身模擬業務使用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; } }