Có cách nào để xem nhanh phần tử tiếp theo trong luồng không? Ý tưởng tăng từ một dòng của một danh sách các đối tượng, nơi mà hai đối tượng sau đây cần được so sánh (để làm mịn một số khác biệt, nhưng điều đó không quan trọng ở đây). Là một for
loop cũ này sẽ như thế nào:Peek phần tử tiếp theo trong luồng
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();
}
Cách tốt nhất cho đến nay như dòng sẽ là:
autobahn.stream()
.limit(autobahn.size()-1)
.filter(car -> car.speed < autobahn.get(autobahn.indexOf(car)+1).speed)
.forEach(car -> car.honk());
Các chính-vấn đề với giải pháp này là phương pháp indexOf
, vì có thể có hai lần cùng một chiếc xe trên autobahn. Một giải pháp tốt hơn sẽ có một số cách để nhìn trộm tiếp theo (hoặc một trước đó) phần tử (với một lớp giúp đỡ, điều này có thể thậm chí có thể, nhưng trông khủng khiếp)
BoxedCar boxedCar = new BoxedCar(autobahn.get(0));
autobahn.stream()
.skip(1)
.filter(car -> boxedCar.setContent(car))
.forEach(car -> car.winTheRace());
với 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;
}
}
hoặc để chuyển hướng Stream<Car>
thành một loại Stream<(Car,Car)>
với luồng thứ hai bằng cách nào đó được tạo ra bởi kênh thứ nhất (điều này nghe có vẻ khủng khiếp và ở đây tôi không có ý tưởng, cách này sẽ trông như thế nào).
Có cách nào tốt đẹp để làm điều này với luồng hoặc chúng tôi bị kẹt vào vòng lặp for
không?
Vòng lặp for is not ridiculous. Trên thực tế, đây có lẽ là mã sạch hơn bạn sẽ có thể viết cho điều này. Bạn luôn có thể sử dụng Luồng trên các chỉ mục nhưng đó là nó. – Tunaki
@Tunaki Tôi đã nói, các luồng sẽ trông vô lý, không phải là vòng lặp. Cho đến nay tôi cũng gắn bó với vòng lặp vì những lý do rõ ràng. Tôi chỉ tự hỏi, nếu có một khả năng tốt đẹp để đạt được điều này cũng với các dòng. Chỉnh sửa, bạn có thể hiểu rằng một phần sai, tôi xóa nó. – ctst
Ah Tôi hiểu lầm xin lỗi. – Tunaki