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到