首页 > 解决方案 > 将嵌套的 foreach 循环转换为流

问题描述

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

它不需要也不起作用,但对我来说它看起来很丑。它应该是什么样子?

标签: javafor-loopif-statementjava-stream

解决方案


这是一个例子。由于我没有您的课程,因此我尝试以这种方式模拟它。想象一下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());

再次,我想提一下,这不是你的确切情况,但我认为情况类似。


推荐阅读