Lambda表達式能夠理解爲是一種匿名函數:它沒有名稱,但有參數列表、函數主體、返回類型,可能還有一個能夠拋出的異常的列表。java
(parameters) -> expression 或者 (parameters) -> {statements;}
1.布爾表達式express
(List<String> list) -> list.isEmpty()
2.建立對象app
() -> new Apple("蘋果")
3.使用一個對象ide
(Apple a) -> {System.out.println(a.getName());}
4.比較兩個對象函數
(Apple a,Apple b) -> a.getName().compareTo(b.getName())
函數式接口就是隻定義了一個抽象方法的接口;好比Java中的Comparator、Runnable、Callabel接口。含有多個 Extension Methods 的接口也屬於函數式接口。測試
1.Lambda表達式容許你直接之內聯的形式爲函數式接口的抽象方法提供實現,並把整個表達式做爲函數式接口的實例。你也可使用匿名內部類來完成一樣的事情,只不過比較麻煩。以下示例:線程
public static void main(String[] args) { /** * 利用Ruunable接口run方法打印數據。一個類,實現Runnable接口, * 這個類能夠作不少事情,不單單隻被用於線程,也能夠用於其餘功能! */ /*lambda表達式*/ Runnable run = () -> System.out.println("hello lambda"); /*匿名內部類*/ Runnable run2 = new Runnable() { @Override public void run() { System.out.println("hello inner class"); } }; process(run); process(run2); } public static void process(Runnable runnable) { runnable.run(); }
經過代碼咱們能夠知道,Lambda表達式的簽名要和函數式接口的抽象方法簽名一致;code
在JDK1.8中你會發現,函數式接口都帶有@FunctionalInterface
註解,表示該接口是函數式接口,若是你用了該註解但接口又不是函數式接口,編譯器就會報錯。對象
在JDK1.6中咱們常見的函數式接口有Comparator
、Runnable
、Callable
等。在JDK1.8的java.util.function
包中引入新的函數式接口,咱們重點介紹一下泛型式函數接口Predicate
、Consumer
、Function
。接口
接口定義了一個test抽象方法,它的做用就是判斷入參的行爲和某已知的參數行爲是否匹配。除此以外,接口中還有 ```and```、```or```等默認方法。 @FunctionalInterface public interface Predicate<T> { boolean test(T t); }
如何使用Predicate
接口,好比說如何挑選紅色蘋果爲例說明
1.蘋果過濾實現
public class FilterApple { public static <T> List<T> filterApple(List<T> lists, Predicate<T> p) { List<T> result = new ArrayList<>(); for (T t : lists) { if (p.test(t)) { result.add(t); } } return result; } }
2.測試
/*測試*/ public static void main(String[] args) { Apple a = new Apple(); a.setColor("green"); Apple b = new Apple(); b.setColor("red"); List<Apple> list = new ArrayList<>(); list.add(a); list.add(b); /*使用lambda表達式定義蘋果過濾規則*/ Predicate<Apple> lambdaPredicate = (Apple apple) -> "red".equals(apple.getColor()); list = FilterApple.filterApple(list, lambdaPredicate); System.out.println(list.toString()); //[Apple(color=red, weight=0, area=null)] }