gpt4 book ai didi

java - 如何将父比较器与子比较器结合起来

转载 作者:行者123 更新时间:2023-12-05 03:18:05 24 4
gpt4 key购买 nike

我有一个父类

@Data
public class Parent {

private String xx;

private int yy;

}

和两个扩展父类的子类

@Data
public class ChildA extends Parent {

private String aa;

}


@Data
public class ChildB extends Parent {

private String bb;

}

附言Parent和ChildA、ChildB的字段比较简单,但是比较多。

我有一个共同的比较器:

Comparator<Parent> commonComparator = Comparator.comparing(Parent::getYy)
.thenComparing(Parent::getXx);

和每个 child 的特定比较对象:

Comparator<ChildA> childAComparator = Comparator.comparing(ChildA::getAa);

Comparator<ChildB> childBComparator = Comparator.comparing(ChildB::getBb);

如果我想对 ChildA 的列表进行排序,我该如何将 commonComparator 与 childAComparator 结合起来?

我试过了:

commonComparator.thenComparing(childAComparator); 

但我遇到了一个问题:

The method thenComparing(Comparator<? super Parent>) in the typeComparator is not applicable for the arguments(Comparator< ChildA >)

最佳答案

我认为核心库中没有可以为您编写这些比较器的函数。但这是一个简单的功能:

private static <T> Comparator<T> compose(
Comparator<? super T> before,
Comparator<T> after) {

return (o1, o2) -> {
int diff = before.compare(o1, o2);
return diff == 0 ? after.compare(o1, o2) : diff;
};
}

然后你就可以把它当作

private static final Comparator<ChildA> combined = 
compose(commonComparator, childAComparator);

请注意,因为 thenComparing() 的界限? super T,它只能在先应用子比较器时组合两个比较器,但在这种情况下,必须先应用父比较器。

关于java - 如何将父比较器与子比较器结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73857217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com