当前位置: 首页 > 面试题库 >

关于Java 8中Comparator的误解

严阳成
2023-03-14
问题内容
public class Test {
    public static void main(String[] args) {
        List<Pair<String, Integer>> list = new ArrayList<>();
        list.add(new Pair<>("1", 8));
        list.add(new Pair<>("3", 2));
        list.add(new Pair<>("2", 15));

        list.stream()
            .sorted(Comparator.comparingInt(p -> p.v))
            .map(p -> p.k)
            .forEach(System.out::println);

    }
}

class Pair<K, V> {
    K k;
    V v;
    public Pair(K k, V v) {
        this.k = k;
        this.v = v;
    }
}

好的,正如您所理解的那样,这段代码是将我的配对密钥从最低值打印到最高值,这样我就得到了预期的输出:

3 1 2

到目前为止,一切都很好。现在我想做相反的事情,我以为我只需要做

list.stream()
    .sorted(Comparator.comparingInt(p -> p.v).reversed())
    .map(p -> p.k)
    .forEach(System.out::println);

但是我得到一个编译错误:

v cannot be resolved or is not a field

因此,似乎comparingInt正在返回Comparator<Object>。为什么会这样呢?它不应该返回Comparator<Integer>吗?

这些都可以在Eclipse Luna版本1和javac中复制。

javac -version => 1.8.0
java  -version => java version "1.8.0_25"

哦,您也可以随意更改我的问题的标题,因为您觉得它太笼统了,但我找不到正确的术语


问题答案:

我认为基本上只是类型推断失败了-因为reverse()调用妨碍了预期的参数类型sorted()和lambda表达式。

如果将类型指定为comparingInt显式,则可以执行以下操作:

list.stream()
    .sorted(Comparator.<Pair<String, Integer>>comparingInt(p -> p.v).reversed())
    .map(p -> p.k)
    .forEach(System.out::println);

或者,如果您只是先声明比较器:

Comparator<Pair<String, Integer>> forward = Comparator.comparingInt(p -> p.v);
list.stream()
    .sorted(forward.reversed())
    .map(p -> p.k)
    .forEach(System.out::println);

在我看来,应该有一个Stream.reverseSorted让这样的事情真的很容易的事情,但是看起来并不存在:(



 类似资料:
  • 问题内容: 我对java.util.PriorityQueue和我自己的Comparator的这个小例子感到非常困惑: 在这段代码中,我在队列中得到了错误的顺序。结果是:而不是 我有什么问题吗?谢谢您的帮助。 问题答案: A 不会按顺序存储其元素。它可以按顺序将它们还给您。 如果您在上调用了3次,则会以适当的顺序恢复元素。

  • 在Java8中,Scala伟大的的等价物是什么? 我很想知道它是,但是reduce必须返回与它所还原的内容类型相同的内容。 例子: 上面代码中的问题是umulator: 因此,有人能给我指出与“foldLeft/修复我的代码”对应的正确方法吗?

  • 描述 (Description) 收藏品没有比较器。 要按排序顺序维护集合,我们使用comparator属性。 语法 (Syntax) collection.comparator 例子 (Example) <!DOCTYPE html> <html> <head> <title>Collection Example</title> <script src = "ht

  • comparator 和 filterator 是一对用来在大型源码中快速找到通用代码片段的工具。可用于检测版权侵犯情况。

  • 我有一个名为Course的对象数组列表,我试着用两种方式对它进行排序,按courseID和Course start time。 然后我有这些比较器: 我用我的主要方法对它们进行排序,如下所示: 代码工作,我可以得到按ID或开始时间排序的列表......但我不明白为什么。在课程类中,compareTo方法仅比较getCourseID。 需要比较courseBeginTime的StartTimeSto

  • 在Java8中,新的包是Java。util。函数包含很多函数接口。该软件包的文档(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)多次提到“函数形状”: 有几种基本函数形状,包括函数(从T到R的一元函数)、消费者(从T到void的一元函数)、谓词(从T到布尔的一元函数)和供应者(从T到