栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8学习笔记 - 方法引用:Lambda的语法糖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8学习笔记 - 方法引用:Lambda的语法糖

Java8学习笔记 - 方法引用:Lambda的语法糖
  • 定义
  • 常见的例子
  • 自己实现`方法引用`
    • 静态方法引用 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);
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号