C'è un modo per sbirciare il prossimo elemento in un flusso? L'idea è passata da un flusso di un elenco di oggetti, in cui è necessario confrontare due oggetti seguenti (per semplificare alcune differenze, ma ciò non dovrebbe importare qui). Come un vecchio for
ciclo sarebbe così:Sbircia il prossimo elemento in un flusso
List<Car> autobahn = getCars();
for (int i = 0; i < autobahn.size()-1; i++) {
if(autobahn.get(i).speed>autobahn.get(i+1).speed)
autobahn.get(i).honk();
}
Il modo migliore per quanto flusso potrebbe essere:
autobahn.stream()
.limit(autobahn.size()-1)
.filter(car -> car.speed < autobahn.get(autobahn.indexOf(car)+1).speed)
.forEach(car -> car.honk());
Il principale problema di questa soluzione è il metodo indexOf
, dal momento che ci potrebbe essere due volte la stessa auto sull'autostrada. Una soluzione migliore sarebbe un modo per sbirciare successivo (o quello prima) elemento (con una classe di aiutare, questo potrebbe essere ancora possibile, ma sembra orribile)
BoxedCar boxedCar = new BoxedCar(autobahn.get(0));
autobahn.stream()
.skip(1)
.filter(car -> boxedCar.setContent(car))
.forEach(car -> car.winTheRace());
con helperclass
class BoxedCar {
Car content;
BoxedCar(Car content) {
this.content = content;
}
boolean setContent(Car content) {
double speed = this.content.speed;
this.content = content;
return content.speed > speed;
}
}
o per deviare il Stream<Car>
in un tipo di Stream<(Car,Car)>
con il secondo flusso in qualche modo creato dal primo (questo suona anche terribile e qui non ho idea, come questo sembrerebbe).
C'è un bel modo per farlo con i flussi, o siamo attaccati allo for
-loop?
Il ciclo for non è affatto ridicolo. In realtà, questo è probabilmente il codice più pulito che potrai scrivere per questo. È sempre possibile utilizzare un flusso sugli indici, ma questo è tutto. – Tunaki
@Tunaki ho detto, i flussi sarebbero ridicoli, non il ciclo. Fino ad ora ho continuato con il ciclo for per ovvi motivi. Mi sto solo chiedendo se c'è una buona possibilità di ottenere questo anche con i flussi. Modifica, puoi capire quella parte sbagliata, la cancello. – ctst
Ah ho frainteso scusa. – Tunaki