Make this anonymous inner class a lambda怎么解决

首先,我们先看一个报这个FindBugs的错误例子。

Collections.sort(listGroup, new Comparator<AttachmentGroup>() {
            @Override
            public int compare(AttachmentGroup o1, AttachmentGroup o2) {
                return codeList.indexOf(o1.getCode()) - codeList.indexOf(o2.getCode());
            }
        });

如果是jdk1.8以下,那么这么写是没有问题的,可是jdk1.8开始支持使用兰布达表达式,这个写法在扫Sonar时就会报问题。

我们来看代码,Comparator是个接口。上课的时候老师说过,接口是不可以实例化的,那这个写法是为什么呢?

原来这个接口是一个函数式接口。如果一个接口只有一个方 法,则编译器会认为这就是一个函数式接口,可以用注解@FunctionalInterface来显示的表示。

这种直接实例化接口的方式其实并不是直接实例化接口,而是创建了一个内部匿名类来实现了这个接口。同时由于实现类必须实现接口的所有方法,所以需要在代码块中写上接口实现的业务逻辑。所以接口不能被实例化的理论还是成立的。

由于这是一个函数式接口,所以这时可以使用Lambda表达式来表示该接口的一个实现。

Lambda表达式怎么写,可以通过你的函数式接口直接去百度,除了自定义的接口,一共也就十几种。

今天我来介绍一种能够不使用兰布达表达式改正这个Sonar的方法。

首先,写一个类实现该接口,然后为这个实现类写构造方法,传入需要处理逻辑的参数,然后在实现类中实现该接口所有的方法。写上自己的逻辑。

public class AttGroupComparatorImpl implements Comparator<AttachmentGroup> {
    
    private List<String> codeList;

    public AttGroupComparatorImpl(List<String> codes) {
        codeList = codes;
    }
    
    @Override
    public int compare(AttachmentGroup o1, AttachmentGroup o2) {
        return codeList.indexOf(o1.getCode()) - codeList.indexOf(o2.getCode());
    }
}

然后,外部引用只要实例化这个实现类即可。

new AttGroupComparatorImpl(codeList)

如果你还有其他的看法或者想法,欢迎在评论区留下你的意见,大家一起讨论,一起进步,做一只有梦想的网虫!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值