ストリームの次の要素を覗く方法はありますか?アイデアはオブジェクトのリストのストリームから2つの次のオブジェクトを比較する必要があります(いくつかの差分を滑らかにするために、ここでは重要ではありません)。ストリーム内の次の要素を確認する
autobahn.stream()
.limit(autobahn.size()-1)
.filter(car -> car.speed < autobahn.get(autobahn.indexOf(car)+1).speed)
.forEach(car -> car.honk());
があるかもしれないので、この解決策の主な-問題は、indexOf
方法であって、
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();
}
これまでの流れは以下のようになりよう最善の方法を:古いfor
ループとしてこれは次のようになります。オートバンの同じ車の2倍。よりよい解決策は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;
}
}
で次の(または前のもの)の要素(助けクラスで、これはさえ可能かもしれませんが、恐ろしい見えます)
BoxedCar boxedCar = new BoxedCar(autobahn.get(0));
autobahn.stream()
.skip(1)
.filter(car -> boxedCar.setContent(car))
.forEach(car -> car.winTheRace());
を覗き見するためにいくつかの方法だろうStream<Car>
を一種のStream<(Car,Car)>
に転用するには、最初のストリームで何とか作成された2番目のストリームを使用します(これはひどく聞こえますが、ここではこれがどのように見えるかわかりません)。
ストリームでこれを行うには良い方法がありますか、for
-loopに固執していますか?
forループはまったくばかげていません。実際には、これはおそらくあなたがこれを書くことができるクリーンなコードです。あなたはいつもインデックス上でストリームを使うことができますが、それだけです。 – Tunaki
@俊明私は言った、ストリームはばかげて見えるだろう、for-loopではない。これまでのところ、私は明白な理由のためにforループを堅持しています。ストリームでもこれを達成する素晴らしい可能性があるのであれば、私は思っています。編集、あなたが間違っている部分を理解することができます、私はそれを削除します。 – ctst
ああ、私は誤って誤解しました。 – Tunaki