从对象列表Java 8获取具有max date属性的对象

And*_*ose 36 java collections java-8

我有一类称为Contact具有Date lastUpdated;可变的.

我想拉出Contact一个List<Contact>有max lastUpdated变量的东西.

我知道这可以通过编写自定义比较器并使用来完成Collections.max,但我想知道是否有一种方法可以在Java 8中完成,不需要使用自定义比较器,因为我只想用一个我的代码中只有一个位置的最大日期,并且Contact该类不应始终使用该lastUpdated变量来比较实例.

Tag*_*eev 56

在Java-8中编写自定义比较器非常简单.使用:

Comparator.comparing(c -> c.lastUpdated);
Run Code Online (Sandbox Code Playgroud)

所以如果你有List<Contact> contacts,你可以使用

Contact lastContact = Collections.max(contacts, Comparator.comparing(c -> c.lastUpdated));
Run Code Online (Sandbox Code Playgroud)

或者,使用方法引用:

Contact lastContact = Collections.max(contacts, Comparator.comparing(Contact::getLastUpdated));
Run Code Online (Sandbox Code Playgroud)

  • 友好提醒未来的读者:请确保预先检查该房产是否含水(不为空)。在这种情况下,lastUpdated 对于集合中的项目不为 null。 (2认同)
  • 如果集合为空,则会抛出 NoSuchElementException (2认同)

Ale*_* C. 23

并且Contact类不应总是使用lastUpdated变量来比较实例

因此,只要您想要按lastUpdated属性比较多个实例,就必须提供自定义比较器,因为这意味着默认情况下此类与此字段不具有可比性.

Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated);
Run Code Online (Sandbox Code Playgroud)

如您所知,您可以使用Collections.max或使用Stream API来根据此字段获取最大实例,但您无法避免编写自定义比较器.


Puc*_*uce 20

尝试以下(未经测试):

contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()
Run Code Online (Sandbox Code Playgroud)