在日期属性为字符串的列表中查找具有最大日期的对象

时间:2019-02-05 09:08:05

标签: java lambda java-8 comparator localdate

说我有一个对象:

<stage stageid="some_stage_id" name="Send Keys Stage" type="Navigate">
    <subsheetid>some_sheet_id</subsheetid>
    <loginhibit />
    <narrative>
    </narrative>
    <displayx>15</displayx>
    <displayy>-30</displayy>
    <displaywidth>120</displaywidth>
    <displayheight>60</displayheight>
    <font family="Segoe UI" size="10" style="Regular" color="000000" />
    <onsuccess>next_stage_id</onsuccess>
    <step>
      <element id="action_on_element_id" />
      <action>
        <id>UIASendKeys</id>
        <arguments>
          <argument>
            <id>newtext</id>
            <value>"Testing keys"</value>
          </argument>
          <argument>
            <id>interval</id>
            <value>
            </value>
          </argument>
        </arguments>
      </action>
    </step>
  </stage>

在这些对象的列表中,可以很容易地找到具有最新日期的对象:

public class MyObject {
     private LocalDate date;
}

当日期为String时,是否存在一种类似的简洁方法来查找具有最新日期的对象?我需要先将日期转换为LocalDates,但不能执行以下操作:

MyObject newest = Collections.max(myObjectList, Comparator.comparing(MyObject::getDate));

2 个答案:

答案 0 :(得分:3)

假设MyObject::getDate返回了LocalDate.parse可接受的格式,那么您几乎是正确的。您只需要编写一个lambda表达式:

Comparator.comparing(o -> LocalDate.parse(o.getDate()))

comparing需要一个Function<MyObject, T>。您应该给它提供一个方法,该方法需要一个MyObject并返回(扩展了Comparable)以进行比较。

了解有关Lambda here的更多信息。

答案 1 :(得分:0)

您还可以创建一个实用程序方法,然后以功能样式使用它:

static <T> Function<T, LocalDate> parsingDate(Function<T, String> extractor){
    return t -> LocalDate.parse(extractor.apply()));
}

MyObject newest = max(myObjectList, comparing(parsingDate(MyObject::getDate)));