IntellijJava8

IntellijJava8,java,intellij-idea,lambda,java-8,Java,Intellij Idea,Lambda,Java 8,这一行编译 List<Trade> trades = otrades.stream() .sorted(Comparator.comparing(t -> t.getMeta().getTradeDate())) .collect(Collectors.toList())); List trades=otrades.stream() .sorted(Comparator.comparing(t

这一行编译

List<Trade> trades = otrades.stream()
                     .sorted(Comparator.comparing(t -> t.getMeta().getTradeDate()))
                     .collect(Collectors.toList()));
List trades=otrades.stream()
.sorted(Comparator.comparing(t->t.getMeta().getTradeDate()))
.collect(Collectors.toList());
但添加一个“thenComparing”并不能

List<Trade>trades = otrades.stream()
                   .sorted(Comparator.comparing(t -> t.getMeta().getTradeDate())
                   .thenComparing(t -> t.getName()))
                   .collect(Collectors.toList()));
Listtrades=otrades.stream()
.sorted(Comparator.comparing(t->t.getMeta().getTradeDate())
.Then比较(t->t.getName())
.collect(Collectors.toList());
编译器错误是无法解析getMeta()

(由于代码中似乎没有任何错误,我假设问题出在IntelliJ中)


由于我不明白的原因,第二种情况下类型推断失败。但是您可以给出
t

List<Trade>trades = otrades.stream()//*******
   .sorted(Comparator.comparing(     (Trade t) -> t.getMeta().getTradeDate())
   .thenComparing(t -> t.getName()))
   .collect(Collectors.toList()));
Listtrades=otrades.stream()//*******
.sorted(Comparator.comparing((Trade t)->t.getMeta().getTradeDate())
.Then比较(t->t.getName())
.collect(Collectors.toList());

在您的示例中,编译器发现
t
交易
(可能是
对象
)的其他东西。这就是为什么找不到方法
getMeta()

它在命令行上编译吗?你没有提到它有或没有。我不确定我假设代码行中没有语法错误。我会更新这个问题,用javac试试。这是一个特别困难的类型推断案例,不同的编译器处理方式不同。是的,你完全正确!不知道为什么会这样?我把你的问题标记为最喜欢的,我会问你:)@Dan很抱歉我的第一个回答有误导性,我认为这是一个帕伦问题;但是,如果在
.sorted()
外部定义比较器,是否会发生此错误?是的,这解决了问题。但是您没有回答为什么原始代码段不起作用