代码之家  ›  专栏  ›  技术社区  ›  Hari Rao

比较器中的链方法。Java 8中列表的比较

  •  4
  • Hari Rao  · 技术社区  · 7 年前

    我有以下对象

    Class Trade{
       private Integer tradeId;
       private Event  eventId;
       private Integer tradeVersion;
    }
    
    Class Event{
      private Integer value;
    }
    
    1. Comparator.comparing(Trade::getEventId().getValue())
    2. 上述方法不起作用
    3. 现在我用的是通常的lambda,如下所示

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

    它起了作用,但好奇地想知道#1是否可能?

    1. Comparator.comparing(Trade::getEventId).thenComparing(Event::getValue) 但没有快乐。
    2. 请注意,这两个类都是第三方的,因此我无法更改它们。
    2 回复  |  直到 7 年前
        1
  •  5
  •   Eugene    7 年前

    它非常简单:

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

    还请注意,您的版本 Comparator.comparing(Trade::getEventId).thenComparing(Event::getValue) 排序依据 eventId 然后由 value

        2
  •  4
  •   Szymon Stepniak    7 年前

    Comparator.comparing(Trade::getEventId().getValue()) 不起作用,因为这是无效的 method reference . 具有 :: 运算符可以引用单个方法,如 Trade::getEventId

    trade -> trade.getEventId()
    

    尽管您可以尝试使用以下命令 Function<Trade, Integer> 表示为以下lambda表达式:

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

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

    PS:铸造至