目录
1. 匿名内部类
是一种特殊的局部内部类,本质上是一个没有名字的抽象类子类对象,或者接口的实现类对象。
用于创建一次性的类实例
目的为了简化书写。
new 父类/接口(参数值){
@Override
重写父类/接口的方法;
}
只有在调用方法时,当方法的形参是一个接口或者抽象类,为了简化代码书写,而直接传递匿名内部类对象给方法。
匿名内部类不能有构造方法,可以访问外部类的成员变量和方法,但需要将这些成员变量和方法声明为final,或者是事实上是final的。
2. Lambda表达式
jdk8新特性,用来简化 匿名内部类。
使用前置条件:只能是接口,有且仅有一个抽象方法(函数式接口)。
(被重写方法的形参列表) -> {
被重写方法的方法体代码;
}
3. 方法引用
- 静态方法引用
- 实例方法引用
- 特定类型方法引用
- 构造器引用
- 对象::实例方法名:引用特定对象的实例方法。
- 类::静态方法名:引用静态方法。
- 类::实例方法名:引用特定类型的任意对象的实例方法。
- 构造方法引用:引用构造方法。
interface Greeting {
void greet(String message);
}
public class Main {
public static void main(String[] args) {
// 使用匿名内部类
Greeting greeting1 = new Greeting() {
@Override
public void greet(String message) {
System.out.println("Hello, " + message + " (Anonymous Inner Class)");
}
};
greeting1.greet("world");
// 使用Lambda表达式
Greeting greeting2 = message -> System.out.println("Hello, " + message + " (Lambda Expression)");
greeting2.greet("world");
// 使用方法引用
Greeting greeting3 = System.out::println;
greeting3.greet("Hello, world (Method Reference)");
}
}
3.1 特定类型方法引用
特定类型的方法引用是没有什么道理的,只是语法的一种约定,遇到这种场景,就可以这样用。
Java约定:
如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数作为方法的主调, 后面的所有参数都是作为该实例方法的入参时,则就可以使用特定类型的方法引用。
格式:
类型::方法名
public class Test2 {
public static void main(String[] args) {
String[] names = {"boby", "angela", "Andy" ,"dlei", "caocao", "Babo", "jack", "Cici"};
// 要求忽略首字符大小写进行排序。
Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 制定比较规则。o1 = "Andy" o2 = "angela"
return o1.compareToIgnoreCase(o2);
}
});
//lambda表达式写法
Arrays.sort(names, ( o1, o2) -> o1.compareToIgnoreCase(o2) );
//特定类型的方法引用!
Arrays.sort(names, String::compareToIgnoreCase);
System.out.println(Arrays.toString(names));
}
}