专栏首页零基础自学Java【Java】基础48:方法引用之学习

【Java】基础48:方法引用之学习

昨天回顾了函数式编程的一些概念。

今天开始学习方法引用,它是lambda表达式的进一步简化版,语法还要更加地简洁。

一、方法引用

现有一个需求:

将一个字符串信息全部转换成大写字母,再打印出来。

利用函数式编程思想编写代码。

1.lambda表达式编写

①函数式接口Printable

这是一个自定义的打印接口,有一个打印信息的抽象方法printMsg()

②lambda表达式

method方法中有两个参数,用lambda表达式表示的是接口的实现类对象。并且在lambda表达式中,业务逻辑已经写出来了。

什么叫业务逻辑?

我的理解是方法内容:根据什么参数得到了什么结果。

上述例子中就是:根据传过来的字符串消息(也就是参数msg)

结果将msg全部变成大写字母(msg.toUpperCase)

这就是业务逻辑,当然我举的这个例子非常简单,现实里肯定要复杂的多。

2.方法引用

方法引用是用来代替lambda表达式的,更加地简洁,从某种意义上来说,它们的作用其实是差不多的。

①方法引用

具体格式为:new MyPrint()::printMsg

核心是这个双冒号“::”,如何理解这个格式?

就可以理解成是MyPrint对象在调用printMsg方法

为什么它能直接这样使用?因为它的逻辑已经存在,也就是MyPrint类中有printMsg方法以及其业务逻辑

②业务逻辑

将字符串msg全部变成大写字母,这就相当于是在MyPrint类中重写了接口中的抽象方法。

3.方法引用和lambda表达式:

现在问题来了:方法引用不是对lambda表达式的简化么?怎么感觉代码还越来越繁琐了?

我们只看①而言,方法引用要比lambda表达式简单吧?

如果我使用方法引用,该业务逻辑无论被使用多少次,我只需要写一次,其它时候直接调用;

如果我是用lambda表达式,我每调用一次就要将业务逻辑写一遍。

所以方法引用的简洁之处在于相同逻辑不需要重复地写

这样理解下来,方法引用要比lambda表达式简洁很多,尤其是在业务逻辑很复杂的时候

当然方法引用的前提:业务逻辑已经存在

  • 如果逻辑已经存在,我直接使用方法引用即可,
  • 如果逻辑不存在,还是乖乖地写lambda表达式。

二、方法引用的其它方式

上述例子中的方法引用是对象在引用方法,除了对象引用之外还有很多其它方式。

1.类名引用

如果是静态方法,直接用类名就可以调用方法。

Java底层中已经写好了很多工具类,其大多数方法都是静态方法,直接使用方法引用会方便很多。

Math是一个工具类,它有一个静态方法abs()。

所以方法引用直接用类名引用abs方法,因为其中的逻辑在Java底层就已经写好了。

类名引用格式如下:

  • lambda表达式:number->Math.abs(number)
  • 方法引用:Math::abs

当然这里面方法引用也有一个局限性,比如说我现在要求得到10倍的绝对值。

lambda表达式直接改业务逻辑就好了;

但是方法引用没办法,因为Java底层没有这样的业务逻辑,就算要用方法引用,我们也得先将逻辑写出来。

2.通过this引用成员方法

代码这样写并不规范,只是为了好观看,所以将它们写在一起了。

this引用格式如下:

  • lambda表达式:name->this.introduce(name)
  • 方法引用:this::introduce

这里面this就是代表本类,本类中已经有introduce方法了,那我用this引用的就是本类中对应的方法。

3.通过super引用成员方法

如果MyClass有个父类,它里面有一个fuIntroduce方法,若是要引用该方法,可以使用super关键字。

使用方式和this是一样的,就不再阐述了。

super引用格式如下:

  • lambda表达式:name->super.fuIntroduce(name)
  • 方法引用:super::fuIntroduce

super就是代表父类,父类中已经有fuIntroduce方法了,那我用super引用的就是父类中对应的方法。

4.类的构造器引用

类构造其格式如下:

  • lambda表达式:name->new Person(name)
  • 方法引用:Person::new

Person::new就相当于创建对象(new Person())

不要看这代码写的这么复杂,其实上就相当于new对象。

当然类的构造器这一块理解的还不算透彻,暂且只需要记住方法引用这样使用就是在创建对象就好了。

5.数组的构造器引用

数组也是Object的子类对象,所以同样具有构造器,只是语法稍有不同。

数组构造器格式如下:

  • lambda表达式:length->new int[length]
  • 方法引用:int[]::new

和类的构造器是一样的道理:

int[]::new就相当于创建数组(new int[length])

总结:

本文分享自微信公众号 - 刘小爱(liuxiaoai946),作者:刘小爱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Java】基础49:两个函数式接口

    给一个某种类型的数据进行判断,得到一个boolean值结果;至于是如何判断的?根据不同情况重写方法就好了。

    刘小爱
  • 【Java】基础51:反射(一)

    在Java中Class本身也就对应一个类,用来表示class文件,任何一个class文件都是Class类的一个对象

    刘小爱
  • 【Java】基础13:面向对象编程

    曾经我一度以为面向对象编程,就是程序员面对着自己的女朋友编程,因为这样会更加有动力有兴趣去写代码,不会脱发,秃顶。

    刘小爱
  • 解决Android使用Handler造成内存泄露问题

      Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收。也就是说...

    砸漏
  • 无埋点实现监测的真相——革新还是噱头?

    小编提示:   本文是宋星老师独家为iCDO供稿。对于想要了解无埋点这一监测方法的朋友,是非常深入浅出,详尽清楚的一篇高质量文章。   这篇文章介绍了: 1. ...

    iCDO互联网数据官
  • 详解Android使用Handler造成内存泄露的分析及解决方法

    Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收。也就是说,一...

    砸漏
  • solr的介绍及安装

    第六步:把/root/solr-4.10.3/example/lib/ext目录下的所有的jar包,添加到solr工程中。

    用户5927264
  • 0700-6.2.0-使用Solr7对多种格式文件建立全文索引

    Solr是一个开源搜索平台,用于构建搜索应用程序。它建立在Lucene(全文搜索引擎)之上。Solr是企业级的,快速的和高度可扩展的。使用Solr构建的应用程序...

    Fayson
  • Django实战-生鲜电商-小结-下

    由于本项目配置了缓存机制,需要在 settings.py 文件中设置。配置redis作为cache和session的存储。

    小团子
  • 如何用tf2.0训练中文聊天机器人chatbot

    一个可以自己进行训练的中文聊天机器人, 根据自己的语料训练出自己想要的聊天机器人,可以用于智能客服、在线问答、智能聊天等场景。目前包含seq2seq、seqGA...

    机器学习AI算法工程

扫码关注云+社区

领取腾讯云代金券