Поєднавши свою початкову ідею та ваші відповіді, я дійшов до того, що здається рішенням мого власного запитання:
public ProducerDTO findAndRemove(String pod) {
ProducerDTO p = null;
try {
p = IntStream.range(0, producersProcedureActive.size())
.filter(i -> producersProcedureActive.get(i).getPod().equals(pod))
.boxed()
.findFirst()
.map(i -> producersProcedureActive.remove((int)i))
.get();
logger.debug(p);
} catch (NoSuchElementException e) {
logger.error("No producer found with POD [" + pod + "]");
}
return p;
}
Це дозволяє видалити об'єкт за допомогою, remove(int)
який не перетинає список знову (як запропонував @Tunaki), і дозволяє повернути видалений об'єкт виклику функції.
Я прочитав ваші відповіді, які пропонують мені вибрати безпечні методи, наприклад ifPresent
замість, get
але я не знаходжу способу використовувати їх у цьому сценарії.
Чи є у такого роду рішень важливі недоліки?
Редагуйте, дотримуючись порад @Holger
Це повинна бути функція, яка мені потрібна
public ProducerDTO findAndRemove(String pod) {
return IntStream.range(0, producersProcedureActive.size())
.filter(i -> producersProcedureActive.get(i).getPod().equals(pod))
.boxed()
.findFirst()
.map(i -> producersProcedureActive.remove((int)i))
.orElseGet(() -> {
logger.error("No producer found with POD [" + pod + "]");
return null;
});
}