- 定义
- 常见的例子
- 自己实现`方法引用`
- 静态方法引用 Class::staticMethod
- 对象的实例方法引用 Instance::instanceMethod
- 任意类型实例方法引用 Class::method
- 构造器引用 Class::new
方法引用可以理解为Lambda的一种语法糖。
当我们有一大堆函数需要接收Lambda时,同样的Lambda大量重复,显然不是我们想要的。
这里的System.out::println就是方法引用
String[] strArr = "a,b,c,d,e,f,g".split(",");
Arrays.stream(strArr).forEach(System.out::println);
自己实现方法引用
首先这是一个直接传入 Lambda 的例子。
@FunctionalInterface
public interface NameFormat{
String format(String str);
}
public class Hero{
public static void showName(String name, NameFormat f){
System.out.println(f.format(name));
}
public static void main(String[] args) {
showName("笨笨", name -> "耀眼的" + name);
}
}
静态方法引用 Class::staticMethod
引用一个类的静态方法myPrint。(不一定是Hero。只要函数声明对的上,什么类都行。)
public class Hero{
public static void myPrint(String str){
System.out.println("【" + str + "】");
}
public static void main(String[] args) {
String[] strArr = "a,b,c".split(",");
Arrays.stream(strArr).forEach(Hero::myPrint);
}
}
对象的实例方法引用 Instance::instanceMethod
唯一的区别就是这里是实现方法。
public class Hero{
public void myPrint(String str){
System.out.println("【" + str + "】");
}
public static void main(String[] args) {
String[] strArr = "a,b,c".split(",");
Hero hero = new Hero();
Arrays.stream(strArr).forEach(hero::myPrint);
}
}
任意类型实例方法引用 Class::method
这个逻辑有点绕,但其实它就是对象的实例方法引用的一个特例。
@FunctionalInterface public interface NameFormat{ String format(T hero); }
参数调用自己的方法format
public class Hero{
public String name;
Hero(String name){ this.name = name; }
public String format1() { return "【" + name +"】"; }
public String format2() { return "{" + name +"}"; }
public String format3() { return "《" + name +"》"; }
public void showName(NameFormat hero){
System.out.println(hero.format(this));
}
}
public class MainClass {
public static void main(String[] args) {
Hero hero = new Hero("笨笨");
hero.showName(Hero::format1);
hero.showName(Hero::format2);
hero.showName(Hero::format3);
}
}
hero.showName(Hero::format1);等同于:
hero.showName(obj -> "【" + obj.name +"】");
等同于:
NameFormat heroFormat = foo -> hero.format1(); hero.showName(heroFormat);构造器引用 Class::new
@FunctionalInterface public interface MyNew{ T getInstance(String name); }
public class Hero{
public String name;
Hero(String name){
this.name = name;
}
}
public class MainClass {
public static void main(String[] args) {
// 直接使用并没什么意义
MyNew nf = Hero::new;
Hero hero = nf.getInstance("笨笨");
System.out.println(hero.name);
// 字符串数组转 Hero数组
List list = Arrays.asList("笨笨", "笑虾", "Jerry");
Hero[] heroes = list.stream().map(Hero::new).toArray(Hero[]::new);
for (Hero h : heroes) {
System.out.println(h.name);
}
}
}



