当前位置: 首页 > 知识库问答 >
问题:

如何获得比较器。比较以正确推断类型参数?

容俊豪
2023-03-14

我有以下课程:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang3.tuple.Pair;

public class Sorter {
    private List<Pair<Long, NameDTO>> dtoPairs = new ArrayList<>();

    public Sorter() {
        Comparator<Pair<Long, NameDTO>> bySize = Comparator.comparing(Pair::getLeft);
        Comparator<Pair<Long, NameDTO>> byName = Comparator.comparing(p -> p.getRight().getName());
        dtoPairs.sort(bySize.reversed().thenComparing(byName));
    }
}

class NameDTO {
    private String name;
    public String getName() {
        return name;
    }
}

这编译没有问题。但是,如果我尝试像这样内联变量:

 dtoPairs.sort(Comparator.comparing(Pair::getLeft).reversed().thenComparing(Comparator.comparing(p -> p.getRight().getName())));

我发现以下编译错误:

Sorter.java:[18,51] incompatible types: cannot infer type-variable(s) T,U
    (argument mismatch; invalid method reference
      method getLeft in class org.apache.commons.lang3.tuple.Pair<L,R> cannot be applied to given types
        required: no arguments
        found: java.lang.Object
        reason: actual and formal argument lists differ in length)

如何编写此表达式以使Java正确理解参数?

共有2个答案

宇文弘懿
2023-03-14

此语句编译得很好:

dtoPairs.sort(Comparator.comparing((Pair<Long, NameDTO> p) -> p.getLeft())
                        .reversed()
                        .thenComparing(Comparator.comparing(p -> p.getRight().getName())));

...这指出了您不编译的原因:当您进行方法引用(Pair:getLeft)时,Pair是原始的,其类型参数被忽略。这使得<代码>然后比较(…) 方法期望一个比较器

司徒浩思
2023-03-14

您需要告诉编译器泛型参数的类型。尝试以下操作:

dtoPairs.sort(
    Comparator.comparing(Pair<Long, NameDTO>::getLeft)
    .reversed()
    .thenComparing(Comparator.comparing(p -> p.getRight().getName())));
 类似资料:
  • 问题内容: 我在db中有类型的字段。我使用PostgreSQL。和查询 不返回行中的值是。 但是例如查询 正常工作。 如何解决此问题并获取行? 问题答案: 要 解决 您的问题,请改用数据类型 ,该数据类型不是浮点类型,而是任意精度类型。 如果将数字文字 输入到(相同的单词,不同的含义)列中,则会存储 确切的 数量- 与a或column列不同,在该列中,值被强制为下一个可能的二进制近似值。这可能是正

  • 我看到了这篇关于用lambdas颠倒顺序的文章,但有一件事甚至让我对传统的比较器实现(或匿名内部类)感到困惑:为什么将第二个参数与第一个参数进行比较会颠倒顺序?

  • 我一直在研究集合之间的差异。排序和列表。排序,特别是关于使用比较器静态方法以及lambda表达式中是否需要参数类型。在我们开始之前,我知道我可以使用方法引用,例如Song::getTitle来克服我的问题,但我这里的查询并不是我想要修复的东西,而是我想要的答案,即为什么Java编译器会以这种方式处理它。 这些是我的发现。假设我们有一个类型的,添加了一些歌曲,有3个标准get方法: 以下是对两种类型

  • 这个问题最近在一次采访中被问到。 这是我使用的以下方法 1)创建一个最大堆priority_queue来存储最近的点

  • 问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正

  • 我需要写一个比较器,取一个a类型的对象a和一个B类型的对象B。这两个对象不是一个公共对象的扩展。他们确实是不同的,但我需要比较这两个对象在它的共同领域。我必须使用比较器接口,因为对象存储在Set中,之后我必须使用CollectionUtils进行操作。我搜索了一点点,我用比较器找到了解决方案,但只有相同的类型。 TXS 附注:我在不同的集合中添加两个对象: 之后我会这样想: