1.为什么使用Lambda?
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码项数据一样进行传递),可以写出来更加简洁、更加灵活的代码。作为一种更为紧凑的代码风格,使得java的语言表达能力得到了提升。
在没有Lambda表达式的时候,我们使用的是匿名内部类,比如:
将其转换为Lambda表达式就是:
2.Lambda表达式语法
Lambda表达式在java语言中引入了一个新的语法元素和操作符,这个操作符为->,该操作符被称为Lambda操作符或剪头操作符。它将Lambda分为两个部分:
- 左侧:指定了Lambda表达式所需要的所有参数
- 右侧:指定了Lambda表达式要执行的功能。
2.1无参,无返回值
Lambda体只需要一条语句
2.2需要一个参数,无返回值
先注意:在参数前面,可以不用加上参数类型,因为编译器可以推断出来。我们下面的举例都没有加上参数类型。详情见2.4。
此时,参数的小括号可以省略:
2.3需要两个参数,有返回值
当表达式里面只有一条语句时,return与大括号都可以省略。
2.4类型推断
上述Lambda表达式中的参数类型都是由编译器推断而来的,Lambda表达式中无需指定类型,程序依然可以编译,因为javac根据程序的上下文,在后台推断出了参数的类型。Lambda表达式的类型依赖与上下文环境,是由编译器推断来的,这就是类型推断。
3.函数式接口
3.1什么是函数式接口
- 只包含一个抽象方法,称为函数式接口。
- 你可以通过Lambda表达式来创建该接口的对象,若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽样方法上进行声明。
- 我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时,javac也会包含一个声明,说这个接口是一个函数式接口
例:
在函数式接口中使用泛型:
作为参数传递Lambda表达式:
作为参数传递Lambda表达式:为了将Lambda表达式作为参数传递,接收Lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口类型。
3.2java内置函数式接口
每一个需要接口的地方,我们都自己创建,是不是有点繁琐呢?没关系,java已经给我们想到了这一步,下面介绍java内置的函数式接口。
3.2.1java内置四大函数式接口
3.2.2其他接口
4.方法引用与构造器引用
4.1方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。实现抽样方法的参数列表,必须与方法的参数列表保持一致!
方法引用:使用操作符“::”将方法名和对象或者类的名字分隔开来。如下三种主要使用情况。
- 对象::实例方法
- 类::静态方法
- 类::实例方法
例如:
等同于:
例如:
等同于:
例如:
注意:当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的参数时:ClassName::methodName
4.2构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,与构造器参数列表要与抽象方法的参数列表一致。
例如:
等同于
4.3数组引用
格式:type[]::new
例如:
等同于