一、基本介绍
Java中::被称为方法引用(Method Reference),其实就是Lambda表达式的一种简化写法。
从Java 8开始,Lambda表达式被广泛使用,但是当Lambda表达式比较复杂时,可以利用::简化Lambda表达式的写法。::是用来访问类方法、构造方法或者实例方法的。
二、静态方法引用
静态方法引用是指引用一个静态方法,通过类名::methodName的方式进行引用。
public class MethodReferenceDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("Jennifer", "Kenny", "Alice");
names.forEach(System.out::println);
}
}
上面的代码中,使用::引用了System.out的println方法。这种写法等价于使用Lambda表达式:
names.forEach(name -> System.out.println(name));
静态方法引用可以减少代码量,使用更加简洁,易于阅读和维护。
三、对象方法引用
对象方法引用是指引用一个对象的方法,通过对象名::methodName的方式进行引用。
class Rect {
private int width;
private int height;
public Rect(){}
public Rect(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() { return width; }
public int getHeight() { return height; }
public void setWidth(int width) { this.width = width; }
public void setHeight(int height) { this.height = height; }
public void print() { System.out.println("Width:" + width + " , Height:" + height); }
}
public class MethodReferenceDemo {
public static void main(String[] args) {
List<Rect> rects = Arrays.asList(new Rect(1, 3), new Rect(2, 5), new Rect(3, 8));
rects.forEach(Rect::print);
}
}
上面的代码中,使用::引用了Rect类的print方法。这种写法等价于使用Lambda表达式:
rects.forEach(rect -> rect.print());
对象方法引用可以让代码更加易读,可以直观地看到方法是被哪个对象调用的。
四、构造方法引用
构造方法引用是指引用一个构造方法,通过类名::new的方式进行引用。
class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
public void introduce() {
System.out.println("Name:" + name + " , Age:" + age);
}
}
public class MethodReferenceDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("Jennifer", "Kenny", "Alice");
List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
persons.forEach(Person::introduce);
}
}
上面的代码中,使用::引用了Person类的构造方法。这种写法等价于使用Lambda表达式:
List<Person> persons = names.stream().map(name -> new Person(name)).collect(Collectors.toList());
构造方法引用可以避免手动实现工厂方法,降低代码的复杂度。
五、总结
Java中的::被称为方法引用,用于简化Lambda表达式的写法。::可以引用静态方法、对象方法和构造方法。静态方法引用可以减少代码量,使得代码更加简洁易读;对象方法引用可以让代码更加易读,可以直观地看到方法是被哪个对象调用的;构造方法引用可以避免手动实现工厂方法,降低代码的复杂度。
原创文章,作者:UZGDD,如若转载,请注明出处:https://www.506064.com/n/333690.html