Java 8 Lambda表达式

Lambda 表达式是函数式编程语言。目前有Scala、Groovy、Erlang、C#、Python、Php、Java、Javascript 等都支持函数编程语言。

Java 8 Lambda 表达式语法

  • Lambda表达式的形式化表示如下所示
Parameters -> an expression
  • 如果Lambda表达式中要执行多个语句块,需要将多个语句块以{}进行包装,如果有返回值,需要显示指定return语句,如下所示:
Parameters -> {expressions;};
  • 如果Lambda表达式不需要参数,可以使用一个空括号表示,如下示例所示
() -> {for (int i = 0; i < 1000; i++) doSomething();};
  • 如果编译器能够推测出Lambda表达式的参数类型,则不需要我们显示的进行指定
# 编译器会根据Lambda表达式对应的函数式接口Comparator进行自动推断
String []datas = new String[] {"peng","zhao","li"};;
Arrays.sort(datas,(v1, v2) -> Integer.compare(v1.length(), v2.length()));
  • 如果Lambda表达式只有一个参数,并且参数的类型是可以由编译器推断出来的,则可以如下所示使用Lambda表达式,即可以省略参数的类型及括号
Stream.of(datas).forEach(param -> {System.out.println(param.length());});

为什么需要Lambda ?

  1. 使用Lambda表达式可以使代码变的更加紧凑
  2. 修改方法的能力,就是函数中可以接受以函数为单元的参数,在C/C++中就是函数指针,在Java中就是Lambda表达式,例如在Java中使用集合类对一个字符串按字符串长度进行排序,代码如下所示:
public static void main(String[] args) {
    String []datas = new String[] {"peng","zhao","li"};
    Arrays.sort(datas,(v1 , v2) -> Integer.compare(v1.length(), v2.length()));
    Stream.of(datas).forEach(param -> System.out.println(param));
}

Lambda 的目标类型: 函数式接口

Java 是面向对象编程的语言, 在java 中lambda表达式不能脱离目标类型存在,这个目录类型就是函数式接口。 如在下面的代码中,可以将Lambda表达式赋值给comp函数接口变量

Comparator comp = (v1,v2) -> Integer.compare(v1.length(), v2.length());

函数式接口具有两个主要特征,是一个接口,这个接口具有唯一的一个抽像方法,我们将满足这两个特性的接口称为函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口

你可能感兴趣的:(Java 8 Lambda表达式)