为何使用Lambda表达式?

  • 在java中,无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法。
  • 在js中,函数参数是一个函数,返回值是另一个函数的情况是非常常见的,js是一门非常典型的函数式语言。

Lambda表达式作用

  • Lambda表达式为JAVA添加了缺失的函数式编程特性,使我们能将函数当作一等公民来看待。
  • 在将函数作为一等公民的语言中,Lambda表达式的类型就是函数,但在JAVA中,Lambda表达式使对象,他们必须依附于一类特别的对象类型–函数式接口(Functional Interface)

Lambad表达式

  • 是一种匿名函数;它是没有声明的方法,即没有访问修饰符,返回值声明和名字。
  • 传递行为,而不仅仅是值 -提升抽象层次,Api重用性好,更灵活。
  • 完整语法:(Type1 arg1,Type2 arg2)->{body}

表达式风格:一句语句,不带分号不带return;
语句风格:多个语句,花括号,return 分号;

Lambda表达式分为三部分:参数 -> 代码块

Java匿名函数就是Function是吗 java匿名函数作为参数_JAVA

构造方法的引用 ArrayList::new 1:借助java类型推断完成推断使一部分类型不需要声明。

即 s-> {System.out.printf(s)}

2:FunctionalInterface

  • 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口,
  • 如果我们在某个接口上声明了@FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口。
  • 如果某个接口只有一个抽象方法,不管它有没有被声明@FunctionalInterface注解,那么编译器依旧会把该接口看为函数式接口。
  • 如果含有Object类的Override方法,函数不会+1。
    3:Consumer类 ,是个FunctionalInterface,代表消费者,不返回值。

外部迭代 – 内部迭代

Iterable.forEach()就是内部迭代

Stream

Stream的map(Function<T,R>).forEach(Consumer)

Function<T,R>

两个default方法,compose /andThen

从第一个方法开始至apply结束,无论中间有多少个,则方法按照以下顺序执行。

参数-->从右到左compose方法-->apply方法-->从左到右andThen方法

public static void main(String[] args) {


    StrComparator strComparator = new StrComparator();
    System.out.println(strComparator.compute(3,arg->4*arg,arg->5+arg,arg->9*arg));

  }
  //执行结果((3*9+5)4+5+5)*4=552
  public Integer compute(Integer a , Function<Integer,Integer> function1,Function<Integer,Integer> function2,Function<Integer,Integer> function3){
    return function1.compose(function2).andThen(function2).andThen(function2).compose(function3).andThen(function1).apply(a);
  }

个人理解:Function接口,泛指那些有一个参数,一个返回值的接口。
也就是说,凡是满足一个参数,或者参数是调用方法的输入,一个返回值的函数式接口都是Function接口的实现类。

而当我们需要传入2个参数时候,我们不能使用Function来实现了,这时候我们要使用另一个函数式接口—>BiFunction<T,U,R>,这是Function接口的另一种具象化。
BiFunction只有andthen方法,且参数是Function<T,R>。且将BiFunction中的apply(t,u)函数后的R作为参数,执行Function<T,R>的apply函数。

Predicate

输入一个参数,返回一个Boolean类型。
default方法,逻辑与或非,isEqual(Object)

Supplier

生产者,不接受任何参数,返回一个T类型。
可以用来调用无餐构造。ABC::new

Comparator

Comparator接口,接受两个相同类型的参数,返回一个int。