作用: 对 Lambda
表达式的简化
双冒号 ::
为引用运算符,而它所在的表达式被称为方法引用。如果Lambda
要表达的函数方案已经存在于某个方
法的实现中,那么则可以通过双冒号来引用该方法作为Lambda
的替代者。
1. 通过对象名引用成员方法
接口类
@FunctionalInterface
public interface Printable {
void print(String str);
}
类方法
public class MethodRefObject {
public void printUpperCase(String str) {
System.out.println(str.toUpperCase());
}
}
main方法
public class Demo04MethodRef {
private static void printString(Printable lambda) {
lambda.print("Hello");
}
public static void main(String[] args) {
MethodRefObject obj = new MethodRefObject();
printString(obj::printUpperCase);
}
}
2. 通过类名称引用静态方法
接口
@FunctionalInterface
public interface Calcable {
int calc(int num);
}
类方法
Math 中的 abs 方法
main方法
public class Demo06MethodRef {
private static void method(int num, Calcable lambda) {
System.out.println(lambda.calc(num));
}
public static void main(String[] args) {
method(‐10, Math::abs);
}
}
3.通过super引用成员方法
接口
@FunctionalInterface
public interface Greetable {
void greet();
}
类方法
父类
public class Human {
public void sayHello() {
System.out.println("Hello!");
}
}
子类
public class Man extends Human {
@Override
public void sayHello() {
System.out.println("大家好,我是Man!");
}
//定义方法method,参数传递Greetable接口
public void method(Greetable g){
g.greet();
}
public void show(){
method(super::sayHello);
}
}
4.通过this引用成员方法
接口
@FunctionalInterface
public interface Richable {
void buy();
}
类方法
public class Husband {
private void buyHouse() {
System.out.println("买套房子");
}
private void marry(Richable lambda) {
lambda.buy();
}
public void beHappy() {
marry(this::buyHouse);
}
}
5.类的构造器的使用
接口
public interface PersonBuilder {
Person buildPerson(String name);
}
类
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
main函数
public class Demo10ConstructorRef {
public static void printName(String name, PersonBuilder builder) {
System.out.println(builder.buildPerson(name).getName());
}
public static void main(String[] args) {
printName("赵丽颖", Person::new);
}
}
6.数组的构造器的使用
接口
@FunctionalInterface
public interface ArrayBuilder {
int[] buildArray(int length);
}
main
public class Demo12ArrayInitRef {
private static int[] initArray(int length, ArrayBuilder builder) {
return builder.buildArray(length);
}
public static void main(String[] args) {
int[] array = initArray(10, int[]::new);
}
}