關於 Java8 Nested loops To Stream

關於Java8NestedloopsToStream

Requirement

在一個Car物件的list中,Car物件本身有Wheel物件。
用兩層迴圈可容易使用條件篩選出符合條件的list。

for迴圈 Example

1
2
3
4
5
6
7
8
9
10
List<Car> filteredCars = new ArrayList<>();
for (Car car : cars) {
for (Wheel wheel : wheels) {
if (car.getColor() == wheel.getColor() && wheel.isWorking()) {
filteredCars.add(car);
break;
}
}
}
return filteredCars;

stream Example

1
2
3
List<Car> filteredCars =
cars.stream().filter (car -> wheels.stream().anyMatch(wheel -> wheel.getColor() == car.getColor() && wheel.isWorking()))
.collect(Collectors.toList());

結論

1
2
3
4
在Java 8 stream 出來之前,篩選資料中的資料只能用多個迴圈來處理,若遇到複雜的需求
程式碼會可讀性低及不好維護。
在Java 8 stream出來後,由上方的example就可以了解同一個需求兩種不同寫法的差異。
尤其當條件越多越複雜的時候,Java 8 stream 語法糖會更容易撰寫跟理解。