Lambda表达式由于语法表示比较另类,初看时会不太理解。Java官方文档提供了从内嵌类到匿名类,再到Lambda表达式简洁清晰的描述,很有助于理解。
内嵌类 (nested/inner class)
Java支持类内嵌其它类定义,即在一个类中定义另一个类,如下,在OuterClass中定义了NestedClass,NestedClass即为内嵌类
Class OuterClass{
…
Class NestedClass{
…}
…
}
以上类定义方式也有叫成员内嵌类(member inner class)。
本地类(local class)
本地类出现在块(block)中,常见的就是在类的方法中出现,如下示,在类LocalClassExample的方法validatePhoneNumber中定义了一个本地类PhoneNumber
//Local Class Example
public class LocalClassExample {
static String repalceChar = "-";
public static void FormatPhoneNumber(
String phoneNumberStr) {
final int numberLength = 10;
class PhoneNumber {
String formattedPhoneNumber = null;
PhoneNumber(String phoneNumber) {
formattedPhoneNumber = phoneNumber.replace(
repalceChar, "");
}
public String getNumber() {
return formattedPhoneNumber;
}
}
PhoneNumber myNumber1 = new PhoneNumber(phoneNumberStr);
if (myNumber1.getNumber() == null) {
System.out.println("First number is invalid");
} else {
System.out.println("First number is " + myNumber1.getNumber());
}
}
public static void main(String[] args) {
FormatPhoneNumber ("123-456-7890");
}
}
匿名类(anonymous class)
匿名类与本地类相似,也出现在块中,但是没有类名。
匿名类定义一个接口的实现,或一个类的扩展(例如重写类的方法)。
如下示,先定义一个PhoneNumber接口,在validatePhoneNumber方法中使用时,new PhoneNumber() 后直接实现接口中的方法。
//Anonymous class example
public class AnonymousClassExample {
static String repalceChar = "-";
interface PhoneNumber {
public String transferAndValidNumber(String phoneNumber);
}
public static void formatPhoneNumber(
String phoneNumberStr) {
final int numberLength = 10;
PhoneNumber myNumber = new PhoneNumber() {
public String transferAndValidNumber(String phoneNumber) {
return phoneNumber.replace(repalceChar, "");
}
};
System.out.println("my number is:" + myNumber.transferAndValidNumber(phoneNumberStr));
}
public static void main(String[] args) {
formatPhoneNumber("123-456-7890");
}
}
Lambda表达式
当匿名类实现的接口中的方法只有一个方法时,可采用Lambda表达式实现。Lambda进一步简化代码编写。
如上面匿名类方法可以采用如下Lambda表达式代替。
可以将上面匿名类代码段
PhoneNumber myNumber = new PhoneNumber() {
public String transferAndValidNumber(String phoneNumber) {
return phoneNumber.replace(repalceChar, "");
}
};
修改为如下Lambda方式:
PhoneNumber myNumber = (String phoneNumber) -> phoneNumber.replace(repalceChar, "");
在Lambda表达式中,省略了new 类名,以及方法名。
以上入参只有一个phoneNumber, 可以去掉入参类型及括号,进一步简化如下:
PhoneNumber myNumber = phoneNumber -> phoneNumber.replace(repalceChar, "");
参考:
Oracle Java文档