Appearance
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?答案肯定是没有必要。那我们又是如何使用已经存在的方案的呢? 本篇文章通过四种情况来解释方法引用符是如何使用的。
先来简单体验一下,方法引用符“::”的使用方法
java
public static void main(String[] args) {
Consumer<String> consumer1 = s -> System.out.println(s);
consumer1.accept("张三");
Consumer<String> consumer2 = System.out::println;
consumer2.accept("张三");
}
静态方法的方法引用
类名::方法名
新建 dog
类
java
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public static void bark(Dog dog) {
System.out.println(dog.name + "叫了");
}
}
引用静态方法 “bark
”
java
public static void main(String[] args) {
Consumer<Dog> consumer = Dog::bark;
consumer.accept(new Dog("哮天犬"));
}
控制台输出:哮天犬叫了
非静态方法使用对象实例引用
改变 Dog
类中的 bark
方法
java
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public void bark(Dog dog) {
System.out.println(dog.name + "叫了");
}
}
使用:
java
public static void main(String[] args) {
Dog dog = new Dog("张三");
Consumer<Dog> consumer = dog::bark;
consumer.accept(dog);
}
控制台输出:张三叫了
无参构造方法的引用
java
public class Dog {
private String name;
// 无参构造
public Dog() {}
public void bark(Dog dog) {
System.out.println(dog.name + "叫了");
}
}
使用
java
public static void main(String[] args) {
Supplier<Dog> supplier = Dog::new;
Dog dog = supplier.get();
}
有参构造方法的引用
java
public class Dog {
private String name;
// 有参构造
public Dog(String name) {
this.name = name;
}
public void bark(Dog dog) {
System.out.println(dog.name + "叫了");
}
}
使用
java
public static void main(String[] args) {
// 接收string,输出Dog,jdk会自动找到有参构造
Function<String,Dog> function = Dog::new;
Dog dog = function.apply("张三");
dog.bark(dog);
}
控制台输出:张三叫了