我想重构我的代码以一次获取所有图像并将其映射到JPA中的ID
我有两个表是图像表,另一个是购物车表。 现在,当我想将购物车检索为列表时,我正在迭代购物车,并通过产品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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会在
map&lt; number,image&gt;
中缓存图像(是否image#getForeignId
返回number
):现在您可以通过响应并直接获取图像。如果可以在没有匹配图像的情况下进行任何响应,我会这样这样做:
如果每个响应的ID是地图中的一个键,则可以摆脱
可选
。I would cache the images in a
Map<Number, Image>
(whetherImage#getForeignId
returnsNumber
) first: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:
If every response's ID is a key in the map just get rid of
Optional
.