将嵌套的foreach循环转换为流

时间:2019-07-12 10:10:40

标签: java for-loop if-statement java-stream

我正在尝试将两个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);

它不是必需的,也不起作用,但是对我来说,它看起来很丑。看起来如何?

2 个答案:

答案 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));
}