再谈数组,自定义排序,接口默认方法,函数式接口注解,初次接触泛型

数组排序
Arrays是老外帮我们封装好的类库 里面的方法为静态方法 不需要实例化 它的出现是因为普通数组功能过于单一 其存在java.util类库下
在MyIndex里面写入以下代码


image.png

运行项目


image.png

从结果可以看出这种排序是按照首字母进行的排序 同理如果是int类型的也可按照数字大小排序
自定义排序
接下来我们创建一个Core包,里面创建一个MyCompare类
目录如下
image.png

在我们输入Arrays.sort("users")过程中编译器会给我们提示该函数第二个参数如下


image.png

接下来我们在新建的MyCompare中写入代码
可以发现
image.png

带有T的标识为泛型 稍后我们会学习到
我们需要在MyCompare里面继承接口Comparator
代码如下
image.png

这时我们鼠标放在implements上 alt+enter
弹出如下
image.png

告诉我们要继承接口
点击implements后出现
image.png

编辑器提示我们必须要实现的是第一个compare方法
点击出现如下代码


image.png

接下来在MyCompare中实现compare方法
代码如下
image.png

接着我们按照自定义排序 想按照字母长度进行排序
在MyIndex里面sort函数第二个参数传入实例化的MyCompare类
代码如下
image.png

运行结果
image.png

可以看出我们是按照字母由小到大的排序
如果将代码改为下面则由大到小排序
image.png

运行结果
image.png

我们还可以简化一下代码
image.png

还可以继续优化代码
在MyIndex文件中 sort方法传入实例化的类时 idea会提示我们传入的最好是一个字符串
这就需要用到泛型
在继承Comparator时后面出现一个T 这里可以指定为String类型 代码如下
image.png

运行结果
image.png

此时MyIndex处的波浪线也消失了
image.png

接下来我们解决一下上面留下的疑惑?
为什么继承接口出现多个抽象方法 只需要实现compare一个就可以呢?
来到MyCompare类 ctrl+鼠标放到Comparator上

会进去它具体实现的文件 可以看见下面一些内容


image.png

自动java1.8开始 支持default方式 带有default的关键字的方法可以有方法体 因此不需要在继承的接口中具体实现。它是一个默认函数
带有default的函数不需要实现了,那为什么 boolean equals(Object obj); 这个函数也没实现呢。
接下来我们了解一下java中的注解
在Comparator.java中可以看见下面这段
image.png

@FunctionalInterface这个东西为java中的注解 简单理解成标注的意思 注解是可以自己定义的 也可以通过编程的方式来完成 也可通过反射的方式来完成注解的功能
@FunctionalInterface为函数式接口
标注为@FunctionalInterface之后,该接口变为函数式接口
(1)有且只有一个抽象方法
(2)default方法不属于抽象方法
(3)如果方法重写了Object中的方法,也不属于抽象方法
也就是说Comparator.java中只能有一个抽象方法
即为
image.png

只不过将abstract省略了而已
函数式接口注解中的英文注释
image.png

说明了default方法不是抽象方法 并且如果一个方法属于Object的一个重写(overriding)也不属于抽象方法
接下来在MyIndex里面随便写入以下代码
image.png

鼠标放入Object进入代码 可以发现里面有如下代码Comparator.java中也有这个函数 所以不是抽象方法
image.png

你可能感兴趣的:(再谈数组,自定义排序,接口默认方法,函数式接口注解,初次接触泛型)