【每周至少一篇 160811】函数对象_Java

我第一次看到这里的时候,就有一种高大上的感觉,虽然很短,两位小伙伴Gizing and Hammer看完之后和我交流。
当一个类是final类时,我们如何创建一个新的类?当我们要用函数findMax找出最大的矩形时,答案依赖于最大的边长或者是最大的面积?当我们用compareTo()比较字符串的长度时,由于该函数不区分大小写,“HBHI”按照字典排序,排在了“adaf”的前面,这显然不是我们想要的结果。
这一系列的问题的解决方案是重写函数,使得其接受两个参数:一个是对象的数组,另外一个是决定方式的函数。将函数作为参数的方法:我们可以将函数包含在一个只有函数的类中,并传递该类的一个实例。事实上,一个函数通过将其放在一个对象内部而被传递,这样的现象叫做函数对象。

//Generic findMax,with function object,
//Precondition:a.size()>0
Public static <AnyType> AnyType findMax(AnyType[] arr, Comparator<? Super AnyType> cmp){
    Int maxIndex = 0;

    For(int i = 1; i < arr.size(); i++)
        If(cmp.compare(arr[i] , arr[maxIndex]) > 0)
            maxIndex = i;

    return arr[maxIndex];
}

Class CaseInsensitiveCompare implements Comparator<String>{
    Public int compare(String lhs, String rhs){
        Return lhs.compareToIgnoreCase(rhs);
}
}

Class TestProgram{
    Public static void main(String[]    args){
        String[] arr = {“ZEBRA”, “alligator”, “crocodie”};
        System.out.println(findMax(arr,new CaseInsensitiveCompare()));
}
}


//定义的Comparator接口
Package java.util;
Public interface Comparator<AnyType>{
    Int compare(AnyType lhs, AnyType rhs);
}

这是数据结构与算法分析Java版中的分析过程,感觉很高大上,以后编代码的过程中,能把语法用到这个地步,同时能从编译器的角度来解释程序,个人觉得能力就是另外一个层面的了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值