方法引用是JDK8的一个新的特性,Lambda是用来简化匿名代码的书写格式的,而方法引用是用来进一步简化Lambda表达式的,它简化的更加过分。
方法引用有:
- 静态方法引用
- 实例方法引用
- 特殊类型的方法引用
- 构造方法引用
其中使用场景会比较多的是前两个,后面的两个倒是不怎么常见。
静态方法引用
使用场景
当别人提前写好的功能放在了一个静态方法中的时候,可以采用这种语法;
语法格式
类名::方法名
实例方法引用
使用场景
当别人提前写好的功能放在了一个成员方法中的时候,可以采用这种语法;
语法格式
对象::方法名
静态&实例方法引用代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public interface A { void abc(String s); }
public class Zhangsan { public static void printString(String s){ System.out.println("静态方法引用执行了!"+s); } public void printString2(String s){ System.out.println("实例方法引用执行了!"+s); }
}
public class Test { public static void main(String[] args) { show("aabbcc", Zhangsan::printString);
Zhangsan zs = new Zhangsan(); show("aabbccdd", zs::printString2);
show("aabbccddee", System.err::println); } public static void show(String s, A a){ a.abc(s); } }
|
特定类型的方法引用
使用场景
如果某个Lambda表达式里只是调用一个实例方法,并且前面的参数列表中的第一个参数是作为方法的主调,后面所有的参数都是作为该实例方法的入参, 此时就可以使用特定类型的方法引用
语法格式
类型::方法
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public interface A { boolean abc(String s1, String s2); }
public class Test { public static void main(String[] args) { show("aa", "bb", String::equals); } public static void show(String s1, String s2, A a){ boolean res = a.abc(s1, s2); System.out.println(s1 + "和" + s2 +"比较结果是:" + res); } }
|
构造方法引用
使用场景
如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用。
语法格式
类名::new
代码案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public interface A { Student newStu(String name); }
public class Student { private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Student(String name) { this.name = name; }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + '}'; } }
public class Test { public static void main(String[] args) { show("李四", name -> new Student(name)); show("李四", Student::new); } public static void show(String name, A a){ Student student = a.newStu(name); System.out.println("学生对象" + student); } }
|