java实现比较的接口_java – 实现接口比较器

我不确定你打算把比较器放在哪里.既然你希望你的班级实现Comparable< Organism>,我会假设你正在寻找像

class Bacteria implements Organism {

enum Shape {ROD, ROUND, SPIRAL};

private final Shape shape;

Comparator comparator =

Comparator

.comparingInt(Organism::getComplexity)

.thenComparing(Bacteria::shape); // illegal

@Override

public int compareTo(Organism other) {

return comparator.compare(this, other);

}

}

这不起作用,因为在上下文中,比较需要一个参数,该参数是一个在生物上运行的函数,而不是一个细菌.你可以像这样解决它 – 我会留给你判断这是否足够优雅:

Comparator comparator =

Comparator

.comparingInt(Organism::getComplexity)

.thenComparing(x -> ((x instanceof Bacteria) ? ((Bacteria)x).getShape() : Shape.ROD));

理论上,您也可以编写自己的方法,将比较器转换为另一个.你不能使用instance.method表示法,所以使用必须是这样的:

Comparator comparator =

MyComparatorUtilities.thenComparingIfInstanceOf(

Comparator.comparingInt(Organism::getComplexity),

Bacteria.class,

Bacteria::getShape);

thenComparingIfInstanceOf的以下实现编译(并允许上面的代码编译),但我还没有尝试测试它:

class MyComparatorUtilities {

public static

> Comparator thenComparingIfInstanceOf(

Comparator comparator,

Class subclass,

Function super U, ? extends V> keyExtractor) {

return (a, b) -> {

int comp = comparator.compare(a, b);

if (comp != 0) {

return comp;

}

if (subclass.isInstance(a) && subclass.isInstance(b)) {

return keyExtractor.apply(subclass.cast(a))

.compareTo(keyExtractor.apply(subclass.cast(b)));

}

return 0;

};

}

}

更多:回答评论:不,我不一定认为这种方法更具可读性或可维护性.事实上,我认为整个设计是不可维护的,因为添加一个会导致比较违反总排序属性的类太容易了;我正在寻找一种不同的设计,从更明确的定义开始,我希望订单如何处理不同类的对象.处理比较的“正确”方式可能取决于不同的设计.

对于类似的问题,我可能会坚持使用compareTo方法,除非我因为某些其他原因需要一个类来返回Comparator(例如,为Organisms定义了多个排序).但是,如果每个compareTo都是具有相同结构的if语句,或者类似的东西,我可能会寻找消除重复的方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值