随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));
Lambda Expressions 笔记
时间: 2024-10-14 03:36:59