Lambda: 是一个匿名函数(作为接口的实例)

  • ->lambda操作符
    • ->:左边lambda形参列表(其实是接口中的抽象方法的形参列表)
    • ->:右边lambda体(重写抽象方法的方法体)
  • 无参无返回值;
    • Runnable r =() ->{System.out.println(“Hello Lambda!”);};
  • 有参无返回值
    • Consumer con = (String str)->{System.out.println(str);};
  • 数据类型可以省略,由编译器推断出,成为”类型推断”
    • Consumer con = (str)->{System.out.println(str);};
  • 只需要一个参数,参数小括号可以省略
    • Consumer con = str->{System.out.println(str);};
  • 两个及其以上的参数,多条执行语句,有返回值

    • Comparator com = (x,y) ->{

      1. 多条执行语句;<br /> return Integer.compare(x,y);<br /> };
  • 只有Lambda只有一条语句时,return与大括号有.可以省略.

    • Comparator com =(x,y) -> Integer.compare(x,y);
  • 接口中,只声明了一个抽象方法,则此接口就称为函数式接口
  • 自定义接口中可以可以加上注解@FunctionalInterface检验是否为函数式接口
  • 匿名实现类表示的现在都可以用Lambda表达式来写

在java.util.function包下定义了Java 8 的丰富的函数式接口(Lambda表达式就是函数接口的实例)

函数式接口 参数类型 返回值 用途
Consumer
消费型接口
T void 对类型为T的对象应用操作,包含方法:
void accept(T t)
Supplier
供给型接口
T 返回类型为T的对象,包含方法:T get()


Function
函数型接口
T R 对类型为T的对象应用操作,并返回结果。结
果是R类型的对象。包含方法:R apply(T t)
Predicate
断定型接口
T boolean 确定类型为T的对象是否满足某约束,并返回
boolean 值。包含方法:boolean test(T t)

image.png

方法引用(Method References)

方法应用就是lambda表达式,也是函数接口的一个实例
传递给Lambda体的操作,已经有了是实现的方法了,就可以使用方法引用
要求接口中的抽象方法的形参列表和返回值类型与方法引用的形参列表的返回值类型相同
类:非静态的方法 第一个参数式引用方法的调用者,第二个参数需要引用方法的参数或者无参数式.className::methodName
类(对象)::方法名

  • 对象::非静态方法

    • Consumer con = (x)->System.out.println(x);

                Consumer<String> con =System.out :: println;<br />                   con.accept("haha");
      
  • 类:静态方法

    • Comparator com =(x,y)->Integer.compare(x,y);

                Comparator<Integer> com =Integer::compare;<br />                   int value = compare(12,32);
      
  • 类:非静态方法

    • BiPredicate bp =(x,y) ->x.equals(y);

                Bipredicate<String,String> bp = String::equals;<br />                   boolean flag = bp1.test("hello","hii");<br />构造器引用 : <br /> 可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致!且方法的返回值即为构造器对应类的对象       <br />ClassName :: new  
      
  • Function fun = (n) -> new MyClass(n);

        Function<Integer,Myclass> fun = MyClass :: new ;<br />          fun.apply("123");//返回Mycalss对象实例
    

数组引用:Type[] ::new

  • Function fun =(n) -> new Integer[n] ;

      Function <Interer,Integer[]> fun = Integer[] :: new ;<br />fun.apply(10);//返回Inrger数组
    

Stream API:

Stream API 对集合数据进行操作,提供了一种高效且易于使用的处理数据的方式。
Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

执行操作

  1. 创建Stream的实例
    1. Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:
      1. default Stream stream() : 返回一个顺序流
      2. default Stream parallelStream() : 返回一个并行流
    2. 通过数组(Arrats)
      1. static Stream stream(T[] array): 返回一个流
      2. public static IntStream stream(int[] array)
      3. public static LongStream stream(long[] array)
      4. public static DoubleStream stream(double[] array)
    3. 通过Stream的of()
      1. public static Stream of(T… values) : 返回一个流
    4. 创建无限流
      1. 迭代:public static Stream iterate(final T seed, final UnaryOperator f)
      2. 生成:public static Stream generate(Supplier s)
  2. 一系列的中间操作(过滤,映射,…)
    • 筛选
      • filter(Predicate p) : 接收 Lambda , 从流中排除某些元素
      • distinct() : 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
      • limit(long maxSize) : 截断流,使其元素不超过给定数量
      • skip(long n) :跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
    • 映射
      • map(Function f) : 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
      • flatMap(Function f) : 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
    • 排序
      • sorted() : 产生一个新流,其中按自然顺序排序
      • sorted(Comparator com) 产生一个新流,其中按比较器顺序排序
  3. 终止操作
    • 匹配与查找
      • allMatch(Predicate p) 检查是否匹配所有元素
      • anyMatch(Predicate p) 检查是否至少匹配一个元素
      • noneMatch(Predicate p) 检查是否没有匹配所有元素
      • findFirst() 返回第一个元素
      • findAny() 返回当前流中的任意元素
      • count() 返回流中元素总数
      • max(Comparator c) 返回流中最大值
      • min(Comparator c) 返回流中最小值
      • forEach(Consumer c)
      • 内部迭代(使用 Collection 接口需要用户去做迭代,
      • 称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)
    • 归约
      • reduce(T iden, BinaryOperator b)可以将流中元素反复结合起来,得到一个值。返回 T
      • reduce(BinaryOperator b)可以将流中元素反复结合起来,得到一个值。返回 Optional
    • 收集
      • collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

Optional类(避免出现空指针异常) 是一个容器类

  • 创建 Optional 类对象的方法:
    • Optional.of(T t) : 创建一个 Optional 实例,t必须非空;
    • Optional.empty() : 创建一个空的 Optional 实例
    • Optional.ofNullable(T t) :t可以为nul
  • 获取Optional 容器的对象:
    • T get(): 如果调用对象包含值,返回该值,否则抛异常
    • T orElse(T other) :如果有值则将其返回,否则返回指定的other对象。
    • T orElseGet(Supplier<? extends T> other) : :如果有值则将其返回,否则返回由Supplier接口实现提供的对象。
    • T orElseThrow(Supplier<? extends X> exceptionSupplier) : :如果有值则将其返
    • 回,否则抛出由Supplier接口实现提供的异常

image.png