根据对象List中某一属性,对List进行排序。
使用集合的sort方法,实现匿名内部类Comparator接口,实现了compare方法。
package com.lwk.test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
/**
* @author lwk
*/
public class Testtemp {
public static void main(String[] args) {
List<JSONObject> objectList = new ArrayList<JSONObject>(){{
add(JSON.parseObject("{\"age\":\"21\",\"height\":\"185\"}"));
add(JSON.parseObject("{\"age\":\"21\",\"height\":\"184\"}"));
add(JSON.parseObject("{\"age\":\"20\",\"height\":\"184\"}"));
add(JSON.parseObject("{\"age\":\"25\",\"height\":\"180\"}"));
add(JSON.parseObject("{\"age\":\"24\",\"height\":\"175\"}"));
add(JSON.parseObject("{\"age\":\"22\",\"height\":\"182\"}"));
}};
Collections.sort(objectList, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject o1, JSONObject o2) {
int i = Integer.parseInt(o1.getString("age")) - Integer.parseInt(o2.getString("age"));
if(i == 0){
return Integer.parseInt(o1.getString("height")) - Integer.parseInt(o2.getString("height"));
}
return i;
}
});
System.out.println("order by age asc then height asc");
for (JSONObject object : objectList) {
System.out.println(object);
}
}
/* public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // 假设x是初始最大值
if ( y.compareTo( max ) > 0 ){
max = y; //y 更大
}
if ( z.compareTo( max ) > 0 ){
max = z; // 现在 z 更大
}
return max; // 返回最大对象
}*/
}
思考:在匿名内部类中,实现了Comparator的compare抽象方法,但是注意到接口中还有另一个方法(equals),在我的测试类中未实现,但是代码没有提示报错。看了一眼源码,该接口试用了@FunctionalInterface注解,翻译及查找资料得知:
根据Java语言规范的定义,一个使用了该注释的接口类型声明将被视为一个 函数式接口。从概念上讲, 一个函数式接口有且只有一个抽象方法。由于默认方法已经有了实现,所以它们不是抽象方法。如果一个接口中声明的抽象方法是重写了超类Object类中任意一个public方法,那么这些抽象方法并不会算入接口的抽象方法数量中。因为任何接口的实现都会从其父类Object或其它地方获得这些方法的实现。
即:
- 一个函数式接口有且只有一个抽象方法。
- 默认方法不是抽象方法,因为它们已经实现了。
- 重写了超类Object类中任意一个public方法的方法并不算接口中的抽象方法。
所以虽然Comparator接口中有两个抽象方法compare和equals,但equals并不算入接口中的抽象方法,所以Comparator接口还是满足函数式接口的要求,Comparator接口是一个函数式接口。
![v2-6fc019ff1583195194d1d17b61cc2dea_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/8635ed96e2051a481323fc434c12b800.jpeg)