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));
  • 相关阅读:
    leetcode Majority Element
    Missing Number 三种解法
    Effective C++学习笔记 chapter 1
    C++ 笔记
    三色排序
    归并排序-就地排序
    506,display有哪些值?说明他们的作用
    505,display,float,position之间的关系(有疑问)
    504,什么是FOUC?怎么避免
    503,display:none;与visibility:hidden;的区别
  • 原文地址:https://www.cnblogs.com/lngrvr/p/java_tut_Lambda.html
Copyright © 2011-2022 走看看