Lambda Expressions 笔记

随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 接口,大致有:

@FunctionalInterface
public 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); };
    }
}

@FunctionalInterface
public 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);
    }
}


@FunctionalInterface
public 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));
posted @ 2014-07-21 14:55  lngrvr  阅读(279)  评论(0编辑  收藏  举报