2015-07-27 8 views
16

Mam klasę o nazwie Contact, która ma zmienną Date lastUpdated;.Pobieranie obiektu z właściwością max date z listy obiektów Java 8

Chciałbym usunąć Contact z List<Contact>, który ma maksymalną wartość lastUpdated zmiennej.

Wiem, że można to zrobić, pisząc niestandardowy komparator i używając Collections.max, ale zastanawiałem się, czy jest sposób, w jaki można to zrobić w Javie 8, który nie wymaga użycia niestandardowego komparatora, ponieważ po prostu chcę pobierz ten z maksymalną datą w jednym miejscu w moim kodzie, a klasa Contact nie powinna zawsze używać zmiennej lastUpdated do porównywania instancji.

Odpowiedz

14

a klasa kontaktowe nie powinny zawsze używać lastUpdated zmienną do porównywania przypadkach

Więc trzeba będzie dostarczyć niestandardową porównawczy gdy chcesz porównać wiele wystąpień ich lastUpdated nieruchomości, jak to oznacza, że ​​ta klasa nie jest domyślnie porównywalna z tym polem.

Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated); 

Jak wiesz, że możesz użyć Collections.max lub strumienia API, aby uzyskać maksymalną instancji według tej dziedzinie, ale nie można uniknąć pisania niestandardowego porównawczy.

+0

Czy jeden lub drugi ('' Collections.max' lub strumień() max (Komparator ) .get() '.) Więcej wydajnych? –

+1

@AndrewMairose Możesz zmierzyć, aby zobaczyć, że nie oczekuję dużej różnicy między nimi, ale tylko pomiary podpowiedzą Ci, jak dokładnie to jest. Podejście strumieniowe pozwala jednak na równoległe wykonywanie obliczeń, jeśli zestaw danych jest wystarczająco duży, aby był tego wart. –

28

Pisanie niestandardowego komparatora w Java-8 jest bardzo proste. Zastosowanie:

Comparator.comparing(c -> c.lastUpdated); 

Więc jeśli masz List<Contact> contacts, można użyć

Contact lastContact = Collections.max(contacts, Comparator.comparing(c -> c.lastUpdated)); 
1

Zastosowanie List<T>.stream().max(Comparator<T>).get() po zdefiniowaniu odpowiedniego Comparator.

8

Spróbuj wykonać następujące czynności (niesprawdzone):

contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()