zoukankan      html  css  js  c++  java
  • 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));
  • 相关阅读:
    树莓派学习记录
    ESP8266
    城轨列控系统
    VMware+CentOS7学习记录
    眼镜
    调试蜂鸣器驱动电路
    假期作业进度6
    假期作业进度5
    假期作业进度4
    假期作业进度3
  • 原文地址:https://www.cnblogs.com/lngrvr/p/java_tut_Lambda.html
Copyright © 2011-2022 走看看