我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java缺失的特性扩展方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java缺失的特性扩展方法是什么

今天小编给大家分享一下Java缺失的特性扩展方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    什么是扩展方法

    扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。

    为什么需要扩展方法

    考虑要实现这样的功能:从 Redis 取出包含多个商品ID的字符串后(每个商品ID使用英文逗号分隔),先对商品ID进行去重(并能够维持元素的顺序),最后再使用英文逗号将各个商品ID进行连接。

    传统写法:

    使用 Stream 写法:

    假设在 Java 中能实现扩展方法,并且我们为数组添加了扩展方法 toList(将数组变为 List),为 List 添加了扩展方法 toSet(将 List 变为 LinkedHashSet),为 Collection 添加了扩展方法 join(将集合中元素的字符串形式使用给定的连接符进行连接),那我们将可以这样写代码:

    相信此刻你已经有了为什么需要扩展方法的答案:

    可以对现有的类库,进行直接增强,而不是使用工具类

    相比使用工具类,使用类型本身的方法写代码更流畅更舒适

    代码更容易阅读,因为是链式调用,而不是用静态方法套娃

    在 Java 中怎么实现扩展方法

    我们先来问问最近大火的 ChatGPT:

    Java缺失的特性扩展方法是什么

    好吧,ChatGPT 认为 Java 里面的扩展方法就是通过工具类提供的静态方法 :)。所以接下来我将介绍一种全新的黑科技:

    Manifold

    准备条件

    Manifold 的原理和 Lombok 是类似的,也是在编译期间通过注解处理器进行处理。所以要在 IDEA 中正确使用 Manifold,需要安装 Manifold IDEA 的插件:

    然后再在项目 pom 的 maven-compiler-plugin 中加入 annotationProcessorPaths:

    如果你的项目中使用了 Lombok,需要把 Lombok 也加入 annotationProcessorPaths:

    编写扩展方法

    JDK 中,String 的 split 方法,使用的是字符串作为参数,即 String[] split(String)。我们现在来为 String 添加一个扩展方法 String[] split(char):按给定的字符进行分割。

    基于 Manifold,编写扩展方法:

    可以发现本质上还是工具类的静态方法,但是有一些要求:

    工具类需要使用 Manifold 的 @Extension 注解

    静态方法中,目标类型的参数,需要使用 @This 注解

    工具类所在的包名,需要以 extensions.目标类型全限定类名 结尾

    —— 用过 C# 的同学应该会会心一笑,这就是模仿的 C# 的扩展方法。

    关于第 3 点,之所以有这个要求,是因为 Manifold 希望能快速找到项目中的扩展方法,避免对项目中所有的类进行注解扫描,提升处理的效率。

    具备了扩展方法的能力,现在我们就可以这样调用了:

    Amazing!而且你可以发现,System.out.println(numStrs.toString()) 打印的居然是数组对象的字符串形式 —— 而不是数组对象的地址。查看反编译后的 App.class,发现是将扩展方法的调用,替换为静态方法调用:

    Java缺失的特性扩展方法是什么

    而数组的 toString 方法,使用的是 Manifold 为数组定义的扩展方法 ManArrayExt.toString(@This Object array):

    Java缺失的特性扩展方法是什么

    [Ljava.lang.String;@511d50c0 什么的,Goodbye,再也不见~

    因为是在编译期将扩展方法的调用替换为静态方法调用,所以使用 Manifold 的扩展方法,即使调用方法的对象是 null 也没有问题,因为处理后的代码是把 null 作为参数传递到对应的静态方法。比如我们对 Collection 进行扩展:

    然后调用的时候:

    java.lang.NullPointerException,Goodbye,再也不见~

    数组扩展方法

    Java缺失的特性扩展方法是什么

    我们看到 List<@Self(true) Object> 这样的写法:@Self 是用来表示被注解的值应该是什么类型,如果是 @Self,即 @Self(false),表示被注解的值和 @This 注解的值是同一个类型;@Self(true) 则表示是数组中元素的类型。

    对于对象数组,我们可以看到 toList 方法返回的就是对应的 List(T 为数组元素的类型):

    Java缺失的特性扩展方法是什么

    但如果是原始类型数组,IDEA 指示的返回值是:

    Java缺失的特性扩展方法是什么

    但是我用的是 Java 啊,擦除法泛型怎么可能拥有 List 这么伟大的功能 &mdash;&mdash; 所以你只能用原生类型来接收这个返回值 :)

    Java缺失的特性扩展方法是什么

    &mdash;&mdash; 许个愿,希望 Project Valhalla 早日 GA。

    我们经常在各个项目中看到,大家先把某个对象包装成 Optional,然后进行 filter、map 等。通过 @Self 的类型映射,你可以这样为 Object 加入一个非常实用的办法:

    那么任何对象,都将拥有 asOpt() 方法。

    相比于之前的需要包装一下的不自然:

    你现在可以自然而然的使用 Optional:

    当然,Object 是所有的类的父类,这样做是否合适,还是需要谨慎的思考一下。

    扩展静态方法

    我们都知道 Java9 给集合添加了工厂方法:

    是不是很眼馋?因为如果用的不是 Java9 及以上版本(Java8:直接报我身份证就行),你就得用 Guava 之类的库 &mdash;&mdash; 然而 ImmutableList.of 用起来终究是比不上 List.of 这样的正统来的自然。

    没关系,Manifold 说:“无所谓,我会出手”。基于 Manifold 扩展静态方法,就是在扩展类的静态方法上,也加上 @Extension:

    然后你就可以欺骗自己已经用上了 Java8 之后的版本 &mdash;&mdash; 你发任你发,我用 Java8。

    BTW,因为 Object 是所有类的父类,如果你给 Object 添加静态扩展方法,那么意味着你可以在任何地方直接访问到这个静态方法,而不需要 import &mdash;&mdash; 恭喜你,解锁了 “顶级函数”。

    以上就是“Java缺失的特性扩展方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java缺失的特性扩展方法是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java缺失的特性扩展方法是什么

    今天小编给大家分享一下Java缺失的特性扩展方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是扩展方法扩展方法,
    2023-07-05

    java swing控件扩展的方法是什么

    Java Swing控件的扩展方法有以下几种:1. 继承基本控件:可以通过继承JButton、JLabel、JTextField等基本控件来创建自定义控件,并在其中添加额外的功能。2. 组合控件:可以通过将多个基本控件组合在一起,形成一个新
    2023-08-26

    Zookeeper扩展的方法是什么

    这篇文章主要介绍“Zookeeper扩展的方法是什么”,在日常操作中,相信很多人在Zookeeper扩展的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Zookeeper扩展的方法是什么”的疑惑有所
    2023-06-05

    Linq扩展方法是什么

    这篇文章主要讲解了“Linq扩展方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linq扩展方法是什么”吧!LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(L
    2023-06-17

    Java2 HTML扩展方法是什么

    本文小编为大家详细介绍“Java2 HTML扩展方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java2 HTML扩展方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。打开Java2htmlta
    2023-06-03

    VB.NET扩展方法的概念是什么

    今天就跟大家聊聊有关VB.NET扩展方法的概念是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VB.NET编程语言的出现,在开发领域中起了很大的作用。它从出现至今,已经发展了各种
    2023-06-17

    mysql水平扩展的方法是什么

    MySQL水平扩展的方法包括以下几种:分区(Partitioning):将大表拆分成多个小表,每个小表称为一个分区,可以根据某个列的值进行分区,提高查询性能。分区还可以将数据存储在不同的磁盘上,提高数据读写的并发性能。分库分表(Shard
    2023-10-27

    php扩展编写的方法是什么

    编写 PHP 扩展的方法通常有以下几个步骤:1. 确定扩展的功能:首先确定要扩展的功能,即需要为 PHP 提供哪些新的功能或功能增强。2. 创建扩展的源代码文件:在 PHP 的源代码目录中创建一个新的目录,并在其中创建扩展的源代码文件。通常
    2023-08-11

    ASP.NET页面的aspx扩展方法是什么

    这篇文章主要讲解了“ASP.NET页面的aspx扩展方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET页面的aspx扩展方法是什么”吧!需求:某网站因业务扩展,需拆分出另
    2023-06-17

    plsql扩展表空间的方法是什么

    在PL/SQL中,可以通过以下方法来扩展表空间:使用ALTER TABLESPACE命令:可以使用ALTER TABLESPACE命令来增加表空间的大小。语法如下:ALTER TABLESPACE tablespace_nameADD
    2023-10-22

    Linux swap的扩展和删除方法是什么

    本篇内容介绍了“Linux swap的扩展和删除方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!wap space是磁盘上的一块区域
    2023-06-27

    redis扩展编译安装的方法是什么

    要在Redis中安装扩展,你可以按照以下步骤进行编译和安装:1. 下载扩展的源代码。你可以从扩展的官方网站或GitHub存储库中获取源代码。2. 解压源代码文件。3. 进入解压后的源代码目录。4. 运行`make`命令编译扩展。5. 运行`
    2023-09-11

    java的特性是什么

    java的特性是:1、简单易学;2、面向对象,使得代码更加可重用和可维护;3、平台无关性,能在不同的操作系统上运行;4、内存管理,通过自动垃圾回收机制来管理内存;5、强类型检查,变量在使用之前必须先声明类型;6、安全性,可以防止未经授权的访
    2023-08-09

    java hashmap扩容的方法是什么

    Java HashMap的扩容方法是通过调用`resize()`方法来实现的。在HashMap的内部实现中,有一个`threshold`属性用于表示HashMap的容量阈值。当HashMap中的元素个数达到了阈值,就会触发扩容操作。在`re
    2023-08-26

    java源文件的扩展名是什么

    这篇文章主要介绍“java源文件的扩展名是什么”,在日常操作中,相信很多人在java源文件的扩展名是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java源文件的扩展名是什么”的疑惑有所帮助!接下来,请跟
    2023-06-20

    pandas返回缺失值位置的方法是什么

    这篇文章主要为大家分析了pandas返回缺失值位置的方法是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“pandas返回缺失值位置的方法是什么”的知识吧
    2023-06-26

    r语言填充缺失值的方法是什么

    在R语言中,可以使用以下方法填充缺失值:1. 使用均值、中位数或众数填充:可以通过计算非缺失值的平均值、中位数或众数,然后用该值来填充缺失值。可以使用mean()、median()和mode()函数来计算这些值,并使用is.na()函数判断
    2023-09-11

    web网站的可扩性展架构是什么

    这篇文章主要讲解了“web网站的可扩性展架构是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web网站的可扩性展架构是什么”吧!扩展性(Extensibility) - 指对现有系统影响
    2023-06-02

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录