我有一个家长班

@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;

}

另外,父母和子元素A、子元素B的字段很少,但有很多.

我有一个共同的比较器:

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

和每个子元素的特定比较器:

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

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

如果我想要对ChildA的a列表进行排序,我如何才能将CommonCompator和ChildACompator组合在一起?

我试过:

commonComparator.thenComparing(childAComparator); 

但我有个问题:

然后,方法比较(比较&lt;?超级父母&>)在类型中 比较器不适用于参数 (比较&lt;ChildA&gt;)

推荐答案

我不认为核心库中有一个函数可以为您组成这些比较器.但这是一个简单的函数:

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相关问答推荐

Kotlin ReadWriteProperty:无法使用T作为具体化类型参数.改为使用类

Jooq隐式地将bigint转换为数字,并且索引不起作用

如何让TaskView总是添加特定的列来进行排序?

try Dockerize Maven应用程序,但发布版本21不支持"

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

更新我们的一个文物后出现了严重的符号引用错误

Springdoc Whitelabel Error Page with Spring V3

无法处理批处理侦听器中的反序列化异常

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

编译多个.Java文件并运行一个依赖于用户参数的文件

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

如何使用Jackson将XML元素与值和属性一起封装

如何让JVM在SIGSEGV崩溃后快速退出?

Domino Designer 14中的保存代理添加了重影库

使用Jackson库反序列化json

有谁能帮我修一下这个吗?使输出变得更加整洁

循环不起作用只有第一个元素重复

如何在右击时 Select 新行?

我无法在我的Spring Boot应用程序中导入CSV依赖项