Объединив свою первоначальную идею и ваши ответы, я пришел к тому, что, кажется, является решением моего собственного вопроса:
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;
});
}