【问题标题】:Cannot resolve method 'get' in 'Object' using streams无法使用流解析 \'Object\' 中的方法 \'get\'
【发布时间】:2022-08-16 17:18:03
【问题描述】:

itemsList<List<String>>。当我添加reversed 时,我看到一个编译错误Cannot resolve method \'get\' in \'Object\'。我在x.get(0) 上得到这个。为什么我会得到这个,我怎样才能得到相反的顺序?我只想根据项目名称对列表进行排序。

    List<List<String>> items = new ArrayList<>();
 List<String> item2 = new ArrayList<>();
        item2.add(\"item2\");
        item2.add(\"3\");
        item2.add(\"4\");
        List<String> item1 = new ArrayList<>();
        item1.add(\"item1\");
        item1.add(\"10\");
        item1.add(\"15\");
        List<String> item3 = new ArrayList<>();
        item3.add(\"item3\");
        item3.add(\"17\");
        item3.add(\"8\");
        items.add(item1);
        items.add(item2);
        items.add(item3);

items.stream().sorted(Comparator.comparing(x -> x.get(0)).reversed()).collect(Collectors.toList())
  • 如果您使用Comparator.&lt;List&lt;String&gt;&gt;comparing(x-&gt;x.get(0)) 会怎样?
  • 我得到Wrong number of type arguments: 1; required: 2
  • 我的错。应该是Comparator.&lt;List&lt;String&gt;, String&gt;comparing(x-&gt;x.get(0))。或者,您可以尝试Comparator.comparing((List&lt;String&gt; x)-&gt;x.get(0))
  • 是的,它有效,但你能告诉我为什么吗?
  • @user3310115 粗略地说,在@dan1st 的评论中,Comparator.&lt;List&lt;String&gt;, String&gt;comparing(x-&gt;x.get(0)),第一个 List&lt;String&gt; 是指您的流使用的元素类型,第二个 String 是实际比较的内容(因为您采用第一个 String 来自每个 List&lt;String 并比较它们)

标签: java


【解决方案1】:

Java 的类型推断在这里失败了。在运行Comparator.comparing(x -&gt; x.get(0)).reversed() 时,由于.reversed(),它无法从返回类型推断Comparator 的类型。由于无法推断它们,Java 只使用Object

为了解决这个问题,您需要以某种方式指定要比较的类型。

这可以通过Comparator.&lt;List&lt;String&gt;, String&gt;&gt; comparing(x-&gt;x.get(0)).reversed() 明确完成。这里,List&lt;String&gt;, String&gt;Comparator.comparing 调用的类型参数。这意味着它们在编译时指定泛型类型的值,因此不必推断它们。第一个类型参数 (List&lt;String&gt;) 是要比较的类型,第二个参数 (String) 是从要比较的类型中提取的 ComparableList#get 的结果)。

或者,您也可以在 lambda 表达式的参数中指定它,并让 Java 从中推断:Comparator.comparing((List&lt;String&gt; x) -&gt; x.get(0)).reversed()。由于 Java 知道 x 属于 List&lt;String&gt; 类型,因此它能够推断出 lambda (Function&lt;List&lt;String&gt;,String&gt;) 和 Comparator.comparing 方法的类型。

Sequenced Collections 添加到Java 中时,您还可以使用使用方法引用。如果使用Comparator.comparing(List::getFirst).reversed(),Java 知道要比较的类型是List,并且能够使用get 方法。请注意,在撰写本文时,List::getFirst 还不是 JDK 的一部分。

作为@Slawmentioned in the comments,您还可以使用完全不同的方法,去掉.reversed 并将其包含在Comparator.comparing 中,如下所示:Comparator.comparing(x -&gt; x.get(0), Comparator.reverseOrder())second parameter is another Comparator that is used for comparing the values extracted from the lambdax -&gt; x.get(0)

【讨论】:

  • Comparator.comparing(x -&gt; x.get(0), Comparator.reverseOrder()) 是另一种选择,可以通过静态导入 comparing 和/或 reverseOrder 来减少冗长
【解决方案2】:
List<List<String>> sorted_list = items.stream()
          .sorted(Comparator.comparing(x -> x.get(0), Comparator.reverseOrder()))
          .collect(Collectors.toList());

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引赞成票。
  • 抱歉,我是这个网站的新手,下次我会尝试在onwords上发布。我写了这段代码来排序逆序[[item3, 17, 8], [item2, 3, 4], [item1, 10, 15]]这将是输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2017-12-03
  • 2018-10-19
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多