Lambda Expressions 筆記

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   os   

隨Java 8發布,"The Java(TM) Tutorials"增加了關於“Lambda Expressions”的教程。本文是此教程的總結、摘要。

 

一、Lambda的實質是一個匿名類

二、Lambda公式只能實現 functional 介面;
  1. 只有一個虛方法的借口,叫做 functional 介面;
  2. functional 介面中可以有一個或多個預設方法和靜態方法。

三、Lambda公式的格式

例如:

p -> p.getGender() == Person.Sex.MALE    && p.getAge() >= 18    && p.getAge() <= 25

  1. "->"是Lambda公式的標記,左邊是參數表,右邊是方法體;

  2. 參數表
    a. Lambda的參數表類似方法的參數表,圓括弧包裹,逗號間隔。如:(p, q, r);
    b. 參數可以有、但是不必有類型修飾,編譯器會自己判斷參數類型;
    c. 只有一個參數可以省略括弧;
    d. 如果對應的方法沒有參數,則Lambda的參數表寫為"() -> "。

  3. 方法體
    a. 同一般方法的方法體;
    b. 如果有多條語句,用{}包裹;
    c. 如果有多條語句,方法要求返回結果,則最後一句用 return 。


四、java 8 在java.util.function 中預定義了一些functionl 介面,大致有:

@FunctionalInterfacepublic interface Consumer<T> {    void accept(T t);    default Consumer<T> andThen(Consumer<? super T> after) {        Objects.requireNonNull(after);        return (T t) -> { accept(t); after.accept(t); };    }}@FunctionalInterfacepublic interface Predicate<T> {    boolean test(T t);    default Predicate<T> and(Predicate<? super T> other) {        Objects.requireNonNull(other);        return (t) -> test(t) && other.test(t);    }    default Predicate<T> negate() {        return (t) -> !test(t);    }    default Predicate<T> or(Predicate<? super T> other) {        Objects.requireNonNull(other);        return (t) -> test(t) || other.test(t);    }    static <T> Predicate<T> isEqual(Object targetRef) {        return (null == targetRef)            ? Objects::isNull            : object -> targetRef.equals(object);    }}@FunctionalInterfacepublic interface Function<T, R> {    R apply(T t);    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {        Objects.requireNonNull(before);        return (V v) -> apply(before.apply(v));    }    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {        Objects.requireNonNull(after);        return (T t) -> after.apply(apply(t));    }    static <T> Function<T, T> identity() {        return t -> t;    }}

 

五、藉助於 java.util.stream 包中定義的流和管道,可以實現彙總操作(Aggregate Operations),如:

roster.stream().filter(    p -> p.getGender() == Person.Sex.MALE    && p.getAge() >= 18    && p.getAge() <= 25).map(p -> p.getEmailAddress()).forEach(email -> System.out.println(email));

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.