Comparator中的链方法。比较Java 8中的List

时间:2017-08-15 14:29:48

标签: java java-8

我有以下对象

Class Trade{
   private Integer tradeId;
   private Event  eventId;
   private Integer tradeVersion;
}

Class Event{
  private Integer value;
}
  1. 对于上述场景,我尝试编写类似Comparator.comparing(Trade::getEventId().getValue())
  2. 的内容
  3. 以上不起作用
  4. 所以现在我选择了通常的lambda,它是以下

    someList.sort((Trade o1, Trade o2) -> o1.getEventId().getValue().compareTo(o2.getEventId().getValue()));

  5. 它很有用但很想知道#1是否可行?

    1. 尝试Comparator.comparing(Trade::getEventId).thenComparing(Event::getValue),但没有快乐。
    2. 请注意,这两个类都是第三方,所以我无法改变它们。

2 个答案:

答案 0 :(得分:4)

表达式::不起作用,因为这是对method reference的无效使用。使用Trade::getEventId运算符,您可以引用单个方法,例如trade -> trade.getEventId() 。这与以下lambda表达式等效:

Function<Trade, Integer>

虽然您可以尝试使用以下(Function<Trade, Integer>) trade -> trade.getEventId().getValue() 表示为以下lambda表达式:

Comparator.comparing((Function<Trade, Integer>) trade -> trade.getEventId().getValue())

然后您的比较器可以定义为:

Function<Trade, Integer>

PS:可能会避免施放到{{1}}。

答案 1 :(得分:4)

这很简单:

trades.sort(Comparator.comparingInt(x -> x.getEventId().getValue()));

另请注意,您的Comparator.comparing(Trade::getEventId).thenComparing(Event::getValue)版本在语义上意味着您首先eventId排序,然后按value排序 < / em>首先想要的是什么。