繁体   English   中英

基于子对象条件在数组数组中查找对象

[英]Finding Object in Array of Arrays based in Sub-Object condition

我需要根据其许多子对象的属性在java中找到一个对象。

我目前拥有的是丑陋的地狱,我相信有一种更有效的方法来做到这一点。 可能使用像 hamcrest 这样的库,或者直接使用 Java(我在 Java 方面的知识不是最好的)。

这是我到目前为止:

private HotelResult findHotelResult(List<HotelResult> hotelResultsList, HotelSelection hotelSelection) {
    for (HotelResult hotelResult : hotelResultsList)
        for (RoomOption roomOption : hotelResult.getRoomOptions())
            for (RoomTypeIds roomTypeIds : roomOption.getRoomTypeIds())
                for (RoomRateIds roomRateIds : roomTypeIds.getRoomRateIds())
                    if ( roomRateIds.getId().equals(hotelSelection.getResultId()) )
                        return hotelResult;

    (...)
}

先感谢您。

如果您使用的是 Java 8 或更高版本,请尝试此操作...

private HotelResult findHotelResult(List<HotelResult> hotelResultsList, HotelSelection hotelSelection) {
    Optional<HotelResult> found = hotelResultsList.stream().filter((r) -> {
        Optional<RoomRateIds> optId = r.getRoomOptions().stream().flatMap(o -> o.getRoomTypeIds().stream())
                .flatMap(rate -> rate.getRoomRateIds().stream())
                .filter(id -> id.getId().equals(hotelSelection.getResultId())).findFirst();
        return optId.isPresent();
    }).findFirst();

    return found.orElse(null);
}

没有比这更有效的方法了,至少在没有将您的数据模型从目前的情况重新组织成完全不同的东西的情况下是这样。

漂亮的、布局干净的嵌套循环并没有错,它清楚地说明了正在发生的事情。 您也许可以用一系列 forEach( ...forEach( ... forEach( ... ) ) ) 替换它们,但随后您将有一个难以辨认的括号缠结要处理,代码的目的将不太清楚,调试代码将变得几乎不可能,并且性能将受到影响。

您向我们展示的代码中唯一可以改进的就是去掉不必要的空行,或者去掉埃及风格的花括号,或者两者兼而有之,因为该代码中的每个花括号都是不必要。

仅此一项,可能会使代码看起来不那么像可以进行一些改进。 既然没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM