1.Lambda表达式
1.1 语法
lambda 表达式的语法格式如下:
(parameters) -> expression或(parameters) ->{statements; }
以下是lambda表达式的重要特征:
· 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
· 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
· 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
· 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
1.2java示例
public class Java8Test {public static void main(String args[]) {interfaceMessage a = s -> System.out.println(s);a.sayMessage1("aaa");}interface interfaceMessage {void sayMessage1(String name);}}//打印aaa
1.3 变量作用域
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在lambda 内部修改定义在域外的局部变量,否则会编译错误。
在Java8Tester.java 文件输入以下代码:
public class Java8Test {final static String salutation = "Hello! ";public static void main(String args[]) {interfaceMessage a = s -> System.out.println(salutation + s);a.sayMessage1("aaa");}interface interfaceMessage {void sayMessage1(String name);}}//打印Hello! aaa
注意:lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有final 的语义)
把最后一行salutation = “hi”;去掉即可。
2.方法引用
1.1
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。
1.2java代码示例
class Car {@FunctionalInterfacepublic interface Supplier<T> {T get();}//Supplier是jdk1.8的接口,这里和lamda一起使用了public static Car create(final Supplier<Car> supplier) {return supplier.get();}public static void collide(final Car car) {System.out.println("Collided " + car.toString());}public void follow(final Car another) {System.out.println("Following the " + another.toString());}public void repair() {System.out.println("Repaired " + this.toString());}public static void main(String[] args) {//构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:Car car = Car.create(Car::new);Car car1 = Car.create(Car::new);Car car2 = Car.create(Car::new);Car car3 = new Car();List<Car> cars = Arrays.asList(car,car1,car2,car3);System.out.println("===================构造器引用========================");//静态方法引用:它的语法是Class::static_method,实例如下:cars.forEach(Car::collide);System.out.println("===================静态方法引用========================");//特定类的任意对象的方法引用:它的语法是Class::method实例如下:cars.forEach(Car::repair);System.out.println("==============特定类的任意对象的方法引用================");//特定对象的方法引用:它的语法是instance::method实例如下:final Car police = Car.create(Car::new);cars.forEach(police::follow);System.out.println("===================特定对象的方法引用===================");}}
总结:
