enhance:增加方法引用。

This commit is contained in:
徐涛 2021-05-20 21:09:52 +08:00
parent 29b99f676c
commit e50f9695bd

View File

@ -103,6 +103,30 @@ something.needSimpleOne(message -> { return doSomething(); })
Lambda表达式只能引用使用`final`标记的外层局部变量即定义在定义Lambda表达式作用域以外的变量。但Lambda表达式可以直接使用与Lambda表达式同作用域的变量而不需要使用`final`标记。Lambda表达式的参数名不能与同作用域的局部变量重名而且Lambda表达式也不能修改所有外部局部变量的值。 Lambda表达式只能引用使用`final`标记的外层局部变量即定义在定义Lambda表达式作用域以外的变量。但Lambda表达式可以直接使用与Lambda表达式同作用域的变量而不需要使用`final`标记。Lambda表达式的参数名不能与同作用域的局部变量重名而且Lambda表达式也不能修改所有外部局部变量的值。
## 方法引用
在引入Lambda表达式以后就经常可能会出现下面这种形式的代码。
```java
bool hasStaff = userList.stream().anyMatch(user -> user.isStaff());
```
这种形式的代码十分的啰嗦而且并不美观。为了解决这个问题Java 8引入了操作符`::`来提供对于方法的引用。所以借助方法引用操作符,就可以把上面这个示例修改成下面的样子。
```java
bool hasStaff = userList.stream().anyMatch(user::isStaff);
```
虽然在这个示例中还不太能看出来这个方法引用操作符的优势,但是它可以将原本必能复杂繁琐的代码进行简化,使代码的逻辑更加容易看清楚。
`::`方法引用操作符除了可以应用在对象实例上,还可以应用在以下这些对象上。
- 调用类中的静态方法:`ClassName::methodName`。
- 调用类实例中的方法:`instanceName::methodName`。
- 针对特定类的任意实例调用方法:`Class::methodName`。
- 调用类自身(`this`)的方法:`this::methodName`。
- 调用类的构造函数:`ClassName::new`。
## 默认方法 ## 默认方法
接口在声明时一般只需要声明其中的方法签名即可这严格遵循了面向抽象编程的概念。但是严格遵循面向抽象编程所带来的不便就是当接口发生修改时所有实现了这个接口的类都需要进行修改。对于大型项目来说这种修改的工作量往往巨大而且还会造成新版本与旧版本之间的不兼容。为了解决这个问题Java 8引入了默认方法。 接口在声明时一般只需要声明其中的方法签名即可这严格遵循了面向抽象编程的概念。但是严格遵循面向抽象编程所带来的不便就是当接口发生修改时所有实现了这个接口的类都需要进行修改。对于大型项目来说这种修改的工作量往往巨大而且还会造成新版本与旧版本之间的不兼容。为了解决这个问题Java 8引入了默认方法。