Lambda表达式是一种带有参数变量的表达式,参数变量可以不传;也可以将其视为一种匿名函数。Lambda表达式没有名字,但是具有参数列表、函数主体、返回类型,甚至还可以抛出异常。
语法
Lambda表达式基本语法:
表达式-风格: (parameters) -> expression
和块-风格: (parameters) -> { expression; }
() -> {}
() -> "this is string!"
i -> i++
(i, j) -> i + j
(int i, int j) -> i + j
(int i, int j) -> {int s = i + j; system.out.println("i + j = " + s); }
根据上面的例子,可以看出:
- Lambda表达式参数列表可以忽略,但小括号不可以忽略,当只有一个参数时,小括号才可以忽略;
- Lambda表达式返回类型不需要指定,也可以为空,Java编译器可以根据上下文推导出其类型;
-
Lambda表达式参数类型可以忽略,Java编译器可以根据上下文推导出其类型;
PS: 如果一个lambda表达式只在某些分支返回一个值,而在另外一些分支不返回值,这是不合法的。例如,(int x)->{if(x>=0)return 1;}
就不合法。
使用
Lambda表达式可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例;匿名内部类也可以完成同样的事情,只不过比较笨拙。
一言以蔽之,哪里需要函数式接口,哪里就可以使用Lambda表达式。
函数式接口
函数式接口是只定义一个抽象方法的接口,这个抽象方法就是这个接口的函数描述符,和Lambda表达式的函数描述是相同的。
函数式接口可以使用@FunctionalInterface来标注,也可以不使用,使用这个注解更方便阅读;但是如果使用这个注解去标注一个非函数式接口会报错,就像@Override一样。
参考资料:
网友评论