Java - фильтровать список объектов по списку свойств и по самой последней дате - PullRequest
0 голосов
/ 18 октября 2018

У меня есть список объектов с именем свойства, компанией и датой.Я хочу отфильтровать этот список, чтобы получить самую последнюю комбинацию имя + компания, основанную на дате.Пример данных:

id | name | company | date
----------------------
 1 | bob  |    A    | 01/2017
 2 | bob  |    A    | 01/2016
 3 | bob  |    A    | 01/2015
 4 | bob  |    B    | 03/2017
 5 | sal  |    B    | 04/2018
 6 | sue  |    A    | 01/2016
 7 | sue  |    A    | 01/2017
 8 | sue  |    A    | 01/2015

Желаемым результатом должен быть список, содержащий идентификаторы: 1, 4, 5 и 7.

Я мог бы просмотреть каждый элемент в моем списке и добавить его вновый список, если комбинация имя + компания не существует, и если она существует, проверьте дату, чтобы увидеть, следует ли заменить существующую.Но я чувствую, что должен быть более простой способ сделать это с помощью потоков и фильтров.Я просто не могу думать о том, как.Поиск предоставляет методы, такие как Collections.max, но я хочу список максимума, основанный на комбо.

Это объекты, созданные Java, а не постоянные объекты, в противном случае я бы сделал что-то вроде этого: GROUP BY с MAX (DATE) .Но я хочу сделать то же самое.

Возможно ли это сделать с помощью фильтра или мой единственный вариант - длинный маршрут?

1 Ответ

0 голосов
/ 18 октября 2018

Вы хотите использовать метод groupingBy из API Collectors.Это позволяет вам обеспечить функцию, которая создает ключ на основе объекта из вашего потока, а затем получает карту>.Вы получите код вроде:

Function<YourObject, String> keyGen = o -> o.getName() + o.getCompany();
Comparator<YourObject> comp = (f1, f2) -> f1.date().compareTo(f2.getDate()
yourObjects.stream().collect(Collectors.groupingBy(keyGen)).values().stream().map(list -> Collections.max(list, comp)).map(MyObject::getId).collect(Collectors.toList());
...