根据对象List中某一属性,对List进行排序,以及对Comparator接口的一些思考

根据对象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或其它地方获得这些方法的实现。

即:

  1. 一个函数式接口有且只有一个抽象方法。
  2. 默认方法不是抽象方法,因为它们已经实现了。
  3. 重写了超类Object类中任意一个public方法的方法并不算接口中的抽象方法。
所以虽然Comparator接口中有两个抽象方法compare和equals,但equals并不算入接口中的抽象方法,所以Comparator接口还是满足函数式接口的要求,Comparator接口是一个函数式接口。

v2-6fc019ff1583195194d1d17b61cc2dea_b.jpg


参考:Java函数式接口的一个疑惑:为什么Comparator接口有两个抽象方法compare和equals,Comparator还是一个函数式接口?(@FunctionalInterface)_H_X_P_的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值