我正在尝试将两个foreach
循环和一个if
语句转换为流。
这是我要转换的内容:
for (ViewFlightRouteAirportType associatedAirportType : etopsAndNonEtopsAssociatedAirportTypes) {
for (ViewFlightAirportDTO airport : flightRoute.getAirportsForType(associatedAirportType)) {
if ( airportIataCode.equals(airport.getIataCode()) ) {
addValueIfNotPresent(associatedFlights, associatedAirportType, flightData);
}
}
}
etopsAndNonEtopsAssociatedAirportTypes
是一个数组。
airportIataCode
是字符串
这是我写的:
Arrays.stream(etopsAndNonEtopsAssociatedAirportTypes)
.forEach(associatedAirportType -> flightRoute.getAirportsForType(associatedAirportType)
.forEach(airport -> flightRoute.getAirportsForType(associatedAirportType)
.stream()
.filter(p -> p.equals(airport.getIataCode())).forEach(addValueIfNotPresent(associatedFlights,associatedAirportType,flightData);
它不是必需的,也不起作用,但是对我来说,它看起来很丑。看起来如何?
答案 0 :(得分:0)
这是一个例子。由于我没有您的课程,因此我尝试用这种方式进行模拟。想象ll
是您的外部for循环数据结构,并且为其中的每个元素创建了另一个集合并遍历该集合。因此,基本上,我们将内部for循环中的这些对象列表作为一个整体集合,以便可以对其进行过滤。在这里可以使用flatMap
来展平集合的集合。然后我们只过滤并收集这些值。
List<String> ll = new ArrayList<>();
ll.stream()
.map(el-> Arrays.asList(el))
.flatMap(List::stream)
.filter(el->el.equals(str))
.collect(Collectors.toList());
我想再次提一提,这不是您的确切情况,但我认为情况类似。
答案 1 :(得分:0)
这个怎么样?我希望您的机场有一个getViewFlightRouteAirportType()
吸气剂,这使我们更容易进行此操作,因为我们不必跟踪etopsAndNonEtopsAssociatedAirportTypes
数组当前类型的值:
Arrays.stream(etopsAndNonEtopsAssociatedAirportTypes)
.map(flightRoute::getAirportsForType)
.flatMap(Collection::stream)
.filter(airport -> airportIataCode.equals(airport.getIataCode()))
.forEach(airport -> addValueIfNotPresent(associatedFlights, airport.getViewFlightRouteAirportType(), flightData));
编辑:如评论中所述
for (ViewFlightRouteAirportType associatedAirportType : etopsAndNonEtopsAssociatedAirportTypes) {
flightRoute.getAirportsForType(associatedAirportType).stream()
.flatMap(Collection::stream)
.filter(airport -> airportIataCode.equals(airport.getIataCode()))
.forEach(airport -> addValueIfNotPresent(associatedFlights, associatedAirportType, flightData));
}