Lambda 基本语法
Lambda 的基本结构为 (arguments) -> body,有如下几种情况:参数类型可推导时,不需要指定类型,如 (a) -> System.out.println(a) 当只有一个参数且类型可推导时,不强制写 (), 如 a -> System.out.println(a) 参数指定类型时,必须有括号,如 (int a) -> System.out.println(a) 参数可以为空,如 () -> System.out.println(“hello”) body 需要用 {} 包含语句,当只有一条语句时 {} 可省略
函数式接口 FunctionalInterface
概念Java Lambda 表达式以函数式接口为基础。什么是函数式接口(FunctionalInterface)? 简单说来就是只有一个方法(函数)的接口,这类接口的目的是为了一个单一的操作,也就相当于一个单一的函数了。常见的接口如:Runnable, Comparator 都是函数式接口,并且都标注了注解 @FunctionalInterface 。
方法引用
方法引用(Method Reference)的基础同样是函数式接口,可以直接作为函数式接口的实现,与 Lambda 表达式有相同的作用,同样依赖于类型推导。方法引用可以看作是只调用一个方法的 Lambda 表达式的简化。方法引用的语法为: Type::methodName 或者 instanceName::methodName , 构造函数对应的 methodName 为 new。例如上面曾用到例子:Function<String, Integer> strToInt = str -> Integer.parseInt(str);对应的方法引用的写法为Function<String, Integer> strToInt = Integer::parseInt;根据方法的类型,方法引用主要分为一下几种类型,构造方法引用、静态方法引用、实例上实例方法引用、类型上实例方法引用等构造方法引用语法为: Type::new 。
Lambda 写法
Function<String, Integer> strToInt = str -> new Integer(str);
总结:
Lambda 表达式确实可以减少很多代码,能提高生产力,当然也有弊端,就是复杂的表达式可读性会比较差,也可能是还不是很习惯的缘故吧,如果习惯了,相信会喜欢上的。凡事都有两面性,就看我们如何去平衡这其中的利弊了,尤其是在一个团队中。