这是我参与更文挑战的第3天,活动详情查看: 更文挑战
业务场景
假设我们在设计一个项目排行功能, 要根据项目的star数量来对其进行排序
抛开数据库的排序查询之外, 有没有在代码中实现的方法呢?
方案
先来设计下项目实体类:
@Data
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class Project {
private Long star;
}
复制代码
想要根据星星数量进行排序, 我们可以实现Comparable接口, 修改实体类:
@Data
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class Project implements Comparable<Project> {
private Long star;
@Override
public int compareTo(Project o) {
return getStar().compareTo(o.getStar());
}
}
复制代码
理论很简单, 在排序时会调用compareTo方法, 返回值存在三种情况:
- 大于0: 比它小
- 等于0: 相同
- 小于0: 比它大
细心的小伙伴肯定早发现了, 实际上我们是调用了基本型Long的compareTo方法
总而言之, 要想实现对类的排序, 我们需要实现Comparable接口中的compareTo即可
本文到此结束
那是不可能的, 这样的实现方式未免太不优雅了, 利用Java8的新特性, 对数组来一次高级的排序操作吧
拓展
利用我们刚才的Project类, 可以进行如下方式排序:
public class Test {
public static void main(String[] args) {
Project one = Project.builder().star(10L).build();
Project two = Project.builder().star(20L).build();
List<Project> test = new ArrayList<>(Arrays.asList(one, two));
test.sort(Project::compareTo);
}
}
复制代码
笔者见到Project::compareTo
的第一反应: Lambda?Stream? (暴露了idea帮我处理代码的本质)
我们去掉对于compareTo方法的使用, 进行一下改造:
public class Test {
public static void main(String[] args) {
Project one = Project.builder().star(10L).build();
Project two = Project.builder().star(20L).build();
List<Project> test = new ArrayList<>(Arrays.asList(one, two));
test.sort((project1, project2) -> {
return project1.getStar().compareTo(project2.getStar());
});
}
}
复制代码
在JDK8中, 我们还可以进行更多一步的升级:
public class Test {
public static void main(String[] args) {
Project one = Project.builder().star(10L).build();
Project two = Project.builder().star(10L).build();
List<Project> test = new ArrayList<>(Arrays.asList(one, two));
test.sort(Comparator.comparing(Project::getStar));
}
}
复制代码
总结
对类的排序有两种方式:
- 实现Comperable接口
- 使用Lambda表达式
二者的区别在于设计层面, 如果类存在单独比较而非排序的情况, 可以根据业务逻辑的复杂程度使用第一种方式
如果只是在数组中进行排序, 可以利用sort方法和Lambda表达式结合
注意, 当compareTo方法返回0时, 强烈建议equals方法的返回值为true
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END