Łącząc mój wstępny pomysł i Twoje odpowiedzi, doszedłem do tego, co wydaje się być odpowiedzią na moje własne pytanie:
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;
}
Pozwala usunąć obiekt za pomocą remove(int)
tego, że nie przechodzi ponownie przez listę (zgodnie z sugestią @Tunaki) i pozwala zwrócić usunięty obiekt do obiektu wywołującego funkcję.
Czytałem twoje odpowiedzi, które sugerują mi wybór bezpiecznych metod, takich jak ifPresent
zamiast, get
ale nie znajduję sposobu, aby ich użyć w tym scenariuszu.
Czy jest jakaś istotna wada tego rodzaju rozwiązania?
Edytuj następujące porady @Holger
To powinna być funkcja, której potrzebowałem
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;
});
}