標籤: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));