我有以下对象
Class Trade{
private Integer tradeId;
private Event eventId;
private Integer tradeVersion;
}
Class Event{
private Integer value;
}
Comparator.comparing(Trade::getEventId().getValue())
所以现在我选择了通常的lambda,它是以下
someList.sort((Trade o1, Trade o2) -> o1.getEventId().getValue().compareTo(o2.getEventId().getValue()))
;
它很有用但很想知道#1是否可行?
Comparator.comparing(Trade::getEventId).thenComparing(Event::getValue)
,但没有快乐。答案 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>首先想要的是什么。