【Java 8實戰】第2篇:Lambda表達式

什麼是Lambda表達式

Lambda表達式能夠理解爲是一種匿名函數:它沒有名稱,但有參數列表、函數主體、返回類型,可能還有一個能夠拋出的異常的列表。java

Lambda表達式語法

(parameters) -> expression
或者
(parameters) -> {statements;}
Lambda有效語法舉例

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())

那些地方可使用Lambda

函數式接口

函數式接口就是隻定義了一個抽象方法的接口;好比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中咱們常見的函數式接口有ComparatorRunnableCallable等。在JDK1.8的java.util.function包中引入新的函數式接口,咱們重點介紹一下泛型式函數接口PredicateConsumerFunction接口


1. Predicate

接口定義了一個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)]
    }
相關文章
相關標籤/搜索