### JDK8的部分新特性
#### Lambda表达式与方法引用
在Java 8中引入了许多重要的新特性,其中最为显著的是Lambda表达式以及由此引申出的方法引用。这些新功能极大地提高了代码的简洁性和可读性,同时使得函数式编程风格在Java中成为可能。
##### Lambda表达式简介
Lambda表达式是一种简洁的、局部的匿名函数,它允许你将行为当作方法参数(即代码作为数据)。Lambda表达式可以用来代替只有一个抽象方法的接口的实例化,这样的接口通常被称为函数式接口。
语法格式如下:
```java
(parameters) -> expression
```
或者
```java
(parameters) -> { statements; }
```
其中,`parameters`是传递给Lambda表达式的参数列表,而`expression`或`statements`则是执行的操作。
例如,一个简单的Lambda表达式可以用于排序操作:
```java
list.sort((x, y) -> x.compareTo(y));
```
这里,`(x, y) -> x.compareTo(y)`是一个Lambda表达式,它表示了一个接受两个参数并返回它们比较结果的函数。
#### 方法引用
当Lambda表达式仅仅是对某个现有方法的调用时,Java 8允许使用更加简洁的方法引用(Method Reference)。方法引用可以用更简单的方式表示Lambda表达式,提高代码的可读性。
方法引用的语法形式如下:
```java
reference::methodName
```
##### 方法引用分类
根据方法引用的不同应用场景,可以将其分为以下几种类型:
1. **静态方法引用**
当你需要引用一个类中的静态方法时,可以使用类名加上双冒号`::`后跟方法名的形式来表示。例如:
```java
Integer::parseInt
```
这表示了一个接受字符串参数并返回其整数解析值的函数。
2. **对象上的成员方法引用**
如果你需要引用特定对象的成员方法,可以使用对象引用加双冒号`::`后跟方法名的形式。例如:
```java
obj::toString
```
这表示了一个接受零个参数并返回该对象字符串表示形式的函数。
3. **当前对象的当前类成员方法引用**
在对象内部引用当前类的成员方法时,可以使用`this::methodName`的形式。例如:
```java
this::print
```
这表示了一个接受适当参数并执行当前对象的`print`方法的函数。
4. **当前对象的继承链成员方法引用**
如果要引用当前对象的父类或其他祖先类中的方法,可以使用`super::methodName`的形式。例如:
```java
super::print
```
这表示了一个接受适当参数并执行父类的`print`方法的函数。
5. **构造方法引用**
引用类的构造方法时,可以使用类名加双冒号`::`后跟`new`关键字的形式。例如:
```java
String::new
```
这表示了一个接受字符串参数并返回新创建的字符串对象的函数。
6. **数组构造方法引用**
创建数组时也可以使用方法引用,语法为数组类型加双冒号`::`后跟`new`关键字。例如:
```java
String[]::new
```
这表示了一个接受整型参数并返回相应大小的字符串数组的函数。
##### 实例:比较字符串长度
假设我们需要定义一个Comparator来比较两个字符串的长度。这里通过不同的方式实现这一功能:
1. **Lambda表达式 - 块**
使用带有大括号的Lambda表达式:
```java
Comparator<String> comp = (s1, s2) -> {
return Integer.compare(s1.length(), s2.length());
};
```
2. **Lambda表达式 - 单语句**
当表达式只有一条语句时,可以省略大括号:
```java
Comparator<String> comp = (s1, s2) -> Integer.compare(s1.length(), s2.length());
```
3. **方法参考 - 静态方法**
直接引用`Integer::compare`静态方法:
```java
Comparator<String> comp = Comparator.comparingInt(String::length);
```
4. **方法参考 - 成员方法**
引用字符串类的`length()`成员方法:
```java
Comparator<String> comp = Comparator.comparing(String::length);
```
通过以上示例可以看到,方法引用不仅使得代码更为简洁,同时也提高了代码的可读性和维护性。