Kombination meiner ersten Idee und Ihre Antworten erreichte ich, was die Lösung auf meine eigene Frage zu sein scheint:
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;
}
Es lässt das Objekt entfernen remove(int)
verwenden, die durchqueren nicht wieder die Liste (wie vorgeschlagen von @Tunaki) und lässt es das entfernte Objekt zu der Funktionsaufrufer zurückgeben.
Ich las Ihre Antworten, die vorschlagen, dass ich sichere Methoden wie ifPresent
anstelle von get
wählen, aber ich finde keine Möglichkeit, sie in diesem Szenario zu verwenden.
Gibt es einen wichtigen Nachteil bei dieser Art von Lösung?
bearbeiten folgende @Holger Beratung
Dies sollte die Funktion brauchte ich
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;
});
}
Dies scheint wirklich ein klassischer Fall, wenn nur eine Schleife und Iterator statt. – chrylis
@chrylis Ich stimme nicht zu;) Wir sind so an die imperative Programmierung gewöhnt, dass jeder andere Weg zu exotisch klingt. Stellen Sie sich vor, die Realität wäre umgekehrt: Wir sind an die funktionale Programmierung gewöhnt und Java fügt ein neues Imperativ hinzu. Würdest du sagen, dass dies der klassische Fall für Streams, Prädikate und Optionals wäre? –
Rufe 'get()' nicht hier auf! Du hast keine Ahnung, ob es leer ist oder nicht. Sie werden eine Ausnahme auslösen, wenn das Element nicht vorhanden war. Verwenden Sie stattdessen eine der sicheren Methoden wie ifPresent, oderElse, oderElseGet oder orElseThrow. –