lambda是 jdk1.8后添加的,匿名函数式的编程方法。

    使用场景:
    接口之中只有一个抽象方法时,可以用lambda表达式声明
    @FunctionalInterface 该注解加在接口类上,声明该类为函数式接口,只会有一个抽象方法

    方法有几个重要的组成元素
    方法名 入参 回参 方法体
    而基于接口的单个方法实现的匿名方法, 其方法名是可以省略,返回参数是可以直接推断。 所以这两个可以完全省略。

    基本格式: () ->{} 小括号内定义入参,大括号内写方法体

    可以省略的内容:
    有且仅有一个参数时,小括号可以省略
    方法体只有一行代码时, 大括号 与 return 关键字可以省略
    参数的类型可以省略,因为参数类型在定义接口时已经固定,可以推断出来

    方法引用
    直接引用一个方法作为接口方法的实现,要求引用的方法入参回参都与接口定义一致
    用法1 () -> 方法持有者::方法

    用法2 构造方法的引用, ()-> 类::new
    其会根据接口中定义的参数,自动调用匹配的构造方法

    jdk 1.8内置的函数式编程支持包
    java.util.function.*
    其中预定义了很多的函数式接口模板, 不同的入参和回参

    ListArray 中对函数式编程的应用
    removeIf(Predicate<? super E> filter)方法,其中Predicate 是jdk内置的函数接口。 removeIf 中使用了该接口的方法作为删除条件。
    所有使用该方法的方式示例 element -> element.indexof(“del”) >=0

    foreach(Consumer<? super E> action) 方法, 循环获得集合中的元素,同时对每个元素做指定的事情。
    用法 element -> System.out.println(element.name())

    典型用法

    1. package com.heiniao.test;
    2. public class Test_lambda {
    3. public static void main(String[] args) {
    4. int[] arr = {1,2,3,4,5,6,7,8,9,0,19};
    5. // num-> num> 6 实现了接口, num>6为过滤条件,将实现作为参数传给 filterTotal
    6. int x = filterTotal(arr, num-> num> 6 );
    7. System.out.println(x);
    8. }
    9. /**
    10. * int 数组,对符合条件的数据进行相加 返回总值
    11. * 具体的过滤实现 由用户实现并传进来
    12. */
    13. public static int filterTotal(int[] arr, ArrayFilter<Integer> arrayFilter){
    14. int sum = 0;
    15. for (int a: arr) {
    16. // 符合过滤条件的 加上
    17. sum+= (arrayFilter.filter(a) ? a : 0);
    18. }
    19. return sum;
    20. }
    21. }
    22. //定义函数式接口
    23. @FunctionalInterface
    24. interface ArrayFilter<T>{
    25. public boolean filter(T t);
    26. }