我想重构我的代码以一次获取所有图像并将其映射到JPA中的ID

发布于 2025-02-10 04:40:03 字数 1239 浏览 1 评论 0原文

我有两个表是图像表,另一个是购物车表。 现在,当我想将购物车检索为列表时,我正在迭代购物车,并通过产品PK查找图像,然后对其进行编码并将其响应。

        for (Cart cart : cartList) {
            itemAndQuantityResponses.add(ItemAndQuantityResponse.builder()
                    .image(fileHandler.getStringImage(imageRepository.findByImageRelationAndForeignId(ImageRelation.ITEM_MAIN, cart.getItem().getId())))
                    .build());
        }

我认为这效率很低,所以我决定对其进行重构以及这样的结果。

        final List<Long> itemIds = cartList.stream().map(Cart::getItem).map(Item::getId).collect(Collectors.toList());
        final List<Image> images = imageRepository.findByImageRelationAndForeignIdIn(ImageRelation.ITEM_MAIN, itemIds);
        for (ItemAndQuantityResponse itemAndQuantityResponse : itemAndQuantityResponses) {
            for (Image image : images) {
                final String stringImage = fileHandler.getStringImage(image);
                if (itemAndQuantityResponse.getItemId().equals(image.getForeignId())) {
                    itemAndQuantityResponse.setImage(stringImage);
                    break;
                }
            }
        }

但是无论哪种方式对我来说都不好。 如果可能的话,我想尽可能避免使用双重循环。

即使是一个微小的提示,对我都会非常有帮助。 感谢您的帮助!

I have two tables the one is Image table and another is Cart table.
When I want to retrieve the carts as list now I am iterating carts and find image by product pk and encode it to string and put it in response.

        for (Cart cart : cartList) {
            itemAndQuantityResponses.add(ItemAndQuantityResponse.builder()
                    .image(fileHandler.getStringImage(imageRepository.findByImageRelationAndForeignId(ImageRelation.ITEM_MAIN, cart.getItem().getId())))
                    .build());
        }

I thought it is quite inefficient so I decided to refactoring it and the results like this.

        final List<Long> itemIds = cartList.stream().map(Cart::getItem).map(Item::getId).collect(Collectors.toList());
        final List<Image> images = imageRepository.findByImageRelationAndForeignIdIn(ImageRelation.ITEM_MAIN, itemIds);
        for (ItemAndQuantityResponse itemAndQuantityResponse : itemAndQuantityResponses) {
            for (Image image : images) {
                final String stringImage = fileHandler.getStringImage(image);
                if (itemAndQuantityResponse.getItemId().equals(image.getForeignId())) {
                    itemAndQuantityResponse.setImage(stringImage);
                    break;
                }
            }
        }

But either way doesn't look good to me.
If it is possible, I want to avoid to use double for loop as much as I can.

Even a tiny hint would be very helpful for me.
Thanks for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风挽心 2025-02-17 04:40:04

我会在map&lt; number,image&gt;中缓存图像(是否image#getForeignId返回number):

Map<Number, Image> imageByForeign = images.stream()
    .collect(Collectors.toMap(Image::getForeignId, Function.identity()));

现在您可以通过响应并直接获取图像。如果可以在没有匹配图像的情况下进行任何响应,我会这样这样做:

for (ItemAndQuantityResponse itemAndQuantityResponse : itemAndQuantityResponses) {
    Optional.of(imageByForeign)
        .map(m -> m.get(itemAndQuantityResponse.getItemId()))
        .map(fileHandler::getStringImage)
        .ifPresent(itemAndQuantityResponse::setImage);

如果每个响应的ID是地图中的一个键,则可以摆脱可选

I would cache the images in a Map<Number, Image> (whether Image#getForeignId returns Number) first:

Map<Number, Image> imageByForeign = images.stream()
    .collect(Collectors.toMap(Image::getForeignId, Function.identity()));

Now you can iterate over the responses and get the images directly. If there can be any responses without a matching image, I would do it like this:

for (ItemAndQuantityResponse itemAndQuantityResponse : itemAndQuantityResponses) {
    Optional.of(imageByForeign)
        .map(m -> m.get(itemAndQuantityResponse.getItemId()))
        .map(fileHandler::getStringImage)
        .ifPresent(itemAndQuantityResponse::setImage);

If every response's ID is a key in the map just get rid of Optional.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文