РЕДАКТИРОВАТЬ: Показанный здесь подход может рассматриваться как злоупотребление операцией Stream.map
, хотя на практике она всегда будет работать (с предупреждением о заключительной ноте в конце начальнойверсия сообщения).
Пожалуйста, обратитесь к приложению для более чистого подхода.
Нет необходимости выполнять какую-либо сортировку (которая является операцией O(NlogN)
), когда всевам нужно найти элемент с максимальной датой.
Вы можете просмотреть список элементов MyObject
, деактивировать их все, найти элемент с максимальной датой и, наконец, активировать его:
myList.stream()
.map(myObject -> { myObject.setActive("0"); return myObject; })
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(myObject -> myObject.setActive("1"));
Этот код читался бы намного лучше, если бы у класса MyObject
были бы беглые методы для установки свойства active
:
public MyObject activated() {
active = "1";
return this;
}
public MyObject deactivated() {
active = "0";
return this;
}
Теперь решение стало бы:
myList.stream()
.map(MyObject::deactivated)
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(MyObject::activated);
Примечание: этот подход может не работать, если источник потока сообщает о том, что он отсортирован.Поскольку вы используете список, этого не произойдет.
Добавление:
Как обсуждалось в комментариях, самый чистый подход будетчтобы установить все элементы в неактивное состояние, затем найти элемент с максимальной датой и установить его в активное состояние:
myList.forEach(myObject -> myObject.setActive("0"));
myList.stream()
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(myObject -> myObject.setActive("1"));
Или используя беглые методы:
myList.forEach(MyObject::deactivated);
myList.stream()
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(MyObject::activated);
Конечно,этот подход требует 2 прохода по списку, но он ясно показывает намерение разработчика и не злоупотребляет потоковым API.
Вариант этого последнего фрагмента может быть:
myList.forEach(MyObject::deactivated);
if (!myList.isEmpty())
Collections.max(myList, Comparator.comparing(MyObject::getDate))
.activated();