资讯专栏INFORMATION COLUMN

乐字节-Java8新特性之方法引用

Codeing_ls / 2811人阅读

摘要:上一篇小乐介绍了新特性函数式接口,大家可以点击回顾。中引入方法引用新特性用于简化应用对象方法的调用,方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用是一种更简洁易懂的表达式。

上一篇小乐介绍了《Java8新特性-函数式接口》,大家可以点击回顾。这篇文章将接着介绍Java8新特性之方法引用。

Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda表达式。

1、基本格式

方法引用使用一对冒号 :: 来简化对象方法的调用,当你想要使用方法引用时,目标引用放在分隔符 :: 前,方法名称放在后面, 如下形式:

方法引用参考示例:

2、方法引用分类

Java8 中对于方法引用主要分为三大类:

构造器引用 Class::new

静态方法引用 Class::static_method

特定对象的方法引用 instance::method

2.1、构造器引用

语法是Class::new,或者更一般的Class< T >::new实例如下

借助构造器引用实例化Iphone 对象,代码如下:

public class IPhone {
    private Integer id;
    private String version;
    private Date createTime;
    private String name;

    public IPhone() {
    }

    public IPhone(Integer id) {
        this.id = id;
    }

    public IPhone(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    ...
}


public static void main(String[] args) {
        /**
         * 构造器引用
         * 无参构造器
         */
        // 实现Supplier 接口 通过构造器引用
        Supplier factory01= IPhone::new;
        IPhone p01 = factory01.get();
        System.out.println(p01);

        /**
         *  等价的Lambda 写法
         */
        Supplier factory02 = ()->new IPhone();
        IPhone p02 = factory02.get();
        System.out.println(p02);
    
    
    
           /**
         * 当构造器方法存在参数 参数个数为1个时
         */
        Function factory03 = IPhone::new;
        IPhone p03 = factory03.apply(2019);
        System.out.println(p03);

        /**
         * 等价的Lambda 写法
         */
        Function factory04 = (id)-> new IPhone(id);
        IPhone p04 = factory04.apply(2019);
        System.out.println(p04);
    
    
           /**
         * 当构造器方法存在参数 参数个数为2个时
         */
        BiFunction factory05 = IPhone::new;
        IPhone p05 = factory05.apply(2019,"iphoneX");
        System.out.println(p05);

        /**
         * 等价的Lambda 写法
         */
        BiFunction factory06 = (id,name)-> new IPhone(id,name);
        IPhone p06 = factory06.apply(2019,"iphoneMax");
        System.out.println(p06);
      /**
         当构造器参数参过2个时怎么解决呢???
      **/
    }
2.2、静态方法引用

语法是Class::static_method,实例如下:

使用静态方法引用 执行IPhone 静态方法

public class IPhone {
    private Integer id;
    private String version;
    private Date createTime;
    private String name;

    public IPhone() {
    }

    public IPhone(Integer id) {
        this.id = id;
    }

    public IPhone(Integer id, String name) {
        this.id = id;
        this.name = name;
    }


    /**
       静态方法
    */
    public  static  void info(){
        System.out.println("这是一部IPhone");
    }
}

/**
 * 定义函数式接口
 */
@FunctionalInterface
public interface PrintFunction{
    void print();
}

 //  静态方法引用
PrintFunction pf01= IPhone::info;
pf01.print();
/**
  * 等价的Lambda 写法
*/
PrintFunction pf02 = () -> {
    IPhone.info();
};
pf02.print();


// 静态方法引用 静态方法存在参数时
/**
 * 定义函数式接口
 */
@FunctionalInterface
public interface PrintFunction02 {
    R print(T t);
}

/**
  * 静态方法引用  方法存在参数时
 */
PrintFunction02 pf03 = IPhone::getPrice;
System.out.println(pf03.print("iphone"));

/**
 * 等价的Lambda 写法
 */
PrintFunction02 pf04 =(str)->{
    return IPhone.getPrice(str);
};
2.3、特定类的任意实例化对象的方法引用

语法是instance::method ,此时引用方法时必须存在实例,示例代码如下:

/**
 * 构造器引用 实例化对象
 * 成员方法引用
*/
BiFunction factory07= IPhone::new;
IPhone p07 = factory07.apply(2019,"iphoneX");
PrintFunction pp= p07::mm;
pp.print();

/**
 * 等价的Lambda 写法
 */
BiFunction factory08 = (id,name)-> new IPhone(id,name);
IPhone p08 = factory08.apply(2019,"iphoneMax");
PrintFunction pp02 = ()->{
    p08.mm();
};
pp02.print();

2.4 类的成员方法引用

(略)
接下来,小乐会继续介绍Java8新特性之Stream,敬请期待。欢迎关注乐字节,记得评论点赞哦。
转发请记得注明出处和作者。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77476.html

相关文章

  • 字节Java8核心特性实战方法引用

    摘要:大家好,我是乐字节的小乐,上一次我们说到了核心特性之函数式接口,接下来我们继续了解又一核心特性方法引用。方法引用是一种更简洁易懂的表达式。感谢光临阅读小乐的,敬请关注乐字节后续将继续讲述等前沿知识技术。 大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...

    lakeside 评论0 收藏0
  • 字节-Java8特性Stream流(上)

    摘要:需要注意的是很多流操作本身就会返回一个流,所以多个操作可以直接连接起来,如下图这样,操作可以进行链式调用,并且并行流还可以实现数据流并行处理操作。为集合创建并行流。 上一篇文章,小乐给大家介绍了《Java8新特性之方法引用》,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分。 1、什么是流? Java Se中对于流的操作有输入输出IO流,而Jav...

    dingda 评论0 收藏0
  • 字节-Java8特性函数式接口

    摘要:上一篇小乐带大家学过新特性表达式,什么时候可以使用通常表达式是用在函数式接口上使用的。使用实现创建产生一个工厂对象以上就是小乐带给大家的新特性之函数式接口,下一篇将会为大家带来新特性之方法引用,敬请关注。 上一篇小乐带大家学过 Java8新特性-Lambda表达式,什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较...

    lakeside 评论0 收藏0
  • 字节-Java8特性-接口默认方法

    摘要:注意当多个父接口中存在相同的默认方法时,子类中以就近原则继承。定义静态默认方法这是版简易计算器接口默认方法使用定义接口并提供默认打印方法定义接口默认方法支持方法形参这是数值运算基本接口。。。 总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性。 Java8 新特性列表如下:...

    arashicage 评论0 收藏0
  • 字节-Java8特性Base64和重复注解与类型注解

    摘要:上一篇小乐给大家说了乐字节新特性之,接下来小乐继续给大家说一说新特性之和重复注解与类型注解。内部类与方法相关的内部类这是一个静态类。也是一个静态类。 上一篇小乐给大家说了《乐字节-Java8新特性之Date API》,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解。 一、Base64 在Java 8中,内置了Base64编解码相关的特性。Java 8中使用...

    1treeS 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<