Java8学习笔记 - 方法引用:Lambda的语法糖
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8学习笔记 - 方法引用:Lambda的语法糖相关的知识,希望对你有一定的参考价值。
Java8学习笔记 - 方法引用:Lambda的语法糖
定义
方法引用可以理解为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<T>{
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> 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>{
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<Hero> nf = Hero::new;
Hero hero = nf.getInstance("笨笨");
System.out.println(hero.name);
// 字符串数组转 Hero数组
List<String> list = Arrays.asList("笨笨", "笑虾", "Jerry");
Hero[] heroes = list.stream().map(Hero::new).toArray(Hero[]::new);
for (Hero h : heroes) {
System.out.println(h.name);
}
}
}
以上是关于Java8学习笔记 - 方法引用:Lambda的语法糖的主要内容,如果未能解决你的问题,请参考以下文章