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

Java 在基于子对象条件的数组数组中查找对象,java,arrays,oop,Java,Arrays,Oop,我需要在java中找到一个基于其多个子对象属性的对象 我现在所拥有的是丑陋的地狱,我相信有一个更有效的方法来做到这一点。 可能使用hamcrest这样的库,或者直接使用Java(我的Java知识不是最好的)。 这就是我到目前为止所做的: private HotelResult findHotelResult(List<HotelResult> hotelResultsList, HotelSelection hotelSelection) { for (HotelResul

我需要在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;

    (...)
}
private HotelResult findHotelResult(列出hotelResultsList、HotelSelection HotelSelection){
对于(HotelResult HotelResult:hotelResultsList)
对于(RoomOption-RoomOption:hotelResult.getRoomOptions())
对于(RoomTypeIds RoomTypeIds:roomOption.getRoomTypeIds())
对于(RoomRateIds RoomRateIds:roomTypeIds.getRoomRateIds())
if(roomRateId.getId().equals(hotelSelection.getResultId()))
返回酒店结果;
(...)
}

提前感谢您。

如果您使用的是Java 8 o更高版本,请尝试此功能

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);
}
private HotelResult findHotelResult(列出hotelResultsList、HotelSelection HotelSelection){
可选的found=hotelResultsList.stream().filter((r)->{
可选optId=r.getRoomOptions().stream().flatMap(o->o.getRoomTypeIds().stream())
.flatMap(rate->rate.getRoomRateIds().stream())
.filter(id->id.getId().equals(hotelSelection.getResultId()).findFirst();
返回optId.isPresent();
}).findFirst();
返回已找到。orElse(空);
}

如果您使用的是Java 8 o更高版本,请尝试此选项

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);
}
private HotelResult findHotelResult(列出hotelResultsList、HotelSelection HotelSelection){
可选的found=hotelResultsList.stream().filter((r)->{
可选optId=r.getRoomOptions().stream().flatMap(o->o.getRoomTypeIds().stream())
.flatMap(rate->rate.getRoomRateIds().stream())
.filter(id->id.getId().equals(hotelSelection.getResultId()).findFirst();
返回optId.isPresent();
}).findFirst();
返回已找到。orElse(空);
}

没有比这更有效的方法了,至少在不将数据模型从当前的数据模型重新组织为完全不同的数据模型的情况下是如此

漂亮的、布局清晰的嵌套循环并没有什么错,它非常清楚发生了什么。您也许可以用一系列forEach(…forEach(…forEach(…))替换它们,但这样您将需要处理一堆难以理解的括号,代码的目的将变得不那么清楚,调试代码几乎不可能,性能将受到影响

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


仅此一点就可能使代码看起来不那么需要改进。因为它没有。

没有比这更有效的方法,至少在不将数据模型从当前的状态重新组织到完全不同的状态下是如此

漂亮的、布局清晰的嵌套循环并没有什么错,它非常清楚发生了什么。您也许可以用一系列forEach(…forEach(…forEach(…))替换它们,但这样您将需要处理一堆难以理解的括号,代码的目的将变得不那么清楚,调试代码几乎不可能,性能将受到影响

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


仅此一点就可能使代码看起来不那么需要改进。如果您使用的是java 8或更高版本,您是否考虑过使用?这样的东西会让我将Kotlin代码集成到我的项目中。然而,上面的评论有很好的观点——流是很好的替代方案。这是一个好主意,看起来像我需要的。如果您使用的是java 8或更高版本,您是否考虑过使用?这样的东西使我将Kotlin代码集成到我的项目中。然而,上面的评论有很好的观点——流是很好的选择。这是一个好主意,看起来像我需要的。效果很好。我现在必须把它应用到不同的地方,将这个作为一个例子引入流中会很好。谢谢你花时间写这篇文章。它很有魅力。我现在必须把它应用到不同的地方,将这个作为一个例子引入流中会很好。谢谢你花时间写这篇文章。使用stream最终效果很好,但你是对的,我的帖子看起来更容易看。然而,由于我可以得到比这更复杂的场景,我想看到一些工具,可以帮助我以不同的方式处理它。顺便说一句,我确实有没有键和空格,但我想确保大家在这里很容易阅读:)使用stream最终效果很好,但你是对的,我的帖子看起来可能更容易看。然而,由于我可以得到比这更复杂的场景,我想看到一些工具,可以帮助我以不同的方式处理它。顺便说一句,我确实没有钥匙和空格,但我想确保大家都能轻松阅读:)