Java 缺失的特性:扩展方法

Posted 阿里系统软件技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 缺失的特性:扩展方法相关的知识,希望对你有一定的参考价值。

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

作者:周密(之叶)

什么是扩展方法

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

为什么需要扩展方法

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

// "123,456,123,789"
String str = redisService.get(someKey)

传统写法:

String itemIdStrs = String.join(",", new LinkedHashSet<>(Arrays.asList(str.split(","))));

使用 Stream 写法:

String itemIdStrs = Arrays.stream(str.split(",")).distinct().collect(Collectors.joining(","));

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

String itemIdStrs = str.split(",").toList().toSet().join(",");

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

  • 可以对现有的类库,进行直接增强,而不是使用工具类
  • 相比使用工具类,使用类型本身的方法写代码更流畅更舒适
  • 代码更容易阅读,因为是链式调用,而不是用静态方法套娃

在 Java 中怎么实现扩展方法

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

好吧,ChatGPT 认为 Java 里面的扩展方法就是通过工具类提供的静态方法

Java 8新特性-接口定义增强

为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念!

Java8 打破了原有的接口的方法定义: 公共的、抽象的 

  • 默认方法
    • Java 8 还允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法。
    • 在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。
    • 但扩展方法不能够重载 Object 中的方法。例如:toString、equals、 hashCode 不能在接口中被重载。
    • 例如:
    • interface  IMassage{
      
          public abstract void print(); //这是接口里面原有的定义
      
          public default void fun(){   //在接口里面定义普通的方法
      
              System.out.println("采用 default 关键字来在接口中定义普通方法!");
          }
      
      }
      
      class MessageImpl implements  IMassage{
      
          @Override
          public void print() {
              System.out.println("接口的实现类!");
          }
      }   
    • Test:
      public class NewInterface {
      
          public static void main(String[] args) {
              IMassage massage = new MessageImpl();
              //普通的方法实现调用
              massage.print();
              //调用在接口中的普通方法
              massage.fun();
      
          }
      }
    •   结果:
  • 静态方法
    • 另外一种就是在接口中定义静态方法,采用 static 关键字
    • 例如:
      interface  IMassage{
      
          public static void  funStatic(){
              System.out.println("采用 static 关键字来在接口中定义静态方法");
          }
      
      }

       

    • 调用的方式跟一般的静态方法调用相同
    •    //调用在接口中定义的static 方法
         IMassage.funStatic();

       

以上是关于Java 缺失的特性:扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

Java 8新特性-接口定义增强

PHP 数据对象 (PDO)

数据缺失处理(pandas)

java8新特性

探讨 java 的三大特性之一:继承

数据分析中缺失值的处理