从数据库查询出数据后并需要把他们和其他数据封装并一起返回时:
- 使用Map<主键,类>先进行封装,这样在后续要用id进行查找时会提高效率
- 例:
List<BookInfo> bookInfoList = bookInfoRepository.findAllBy(libraryId);//根据图书馆id查出一个bookInfo类的列表
List<Long> bookIdList = bookInfoList.stream().map(BookInfo::getBookId).collect(Collectors.toList());//拿到所有的bookId
List<Book> bookList = bookRepository.findAllById(bookIdList);//查到所有的Book实体
我需要从这两个类里组合数据返回BookDto,那么在使用stream流去进行操作的情况下,我可以使用Map<bookId, Book> 去先进行封装,这么做的好处:
- 快速查找和访问元素:可以根据bookId以O(1)的时间复杂度得到对应的Book
- 可以保证数据的唯一性,防止有重复元素
做法:
Map<Long, BookInfo> assambleCollection = bookInfoList.stream().collect(Collectors.toMap(BookInfo::getBookId, Function.identity()));//封装成一个map加快查询
List<BookDto> returnList = bookList.stream().map(book -> {
BookDto bookDto = new BookDto(book, assambleCollection.get(book.getBookId()));//这里可以根据需要写一个构造函数
// 可以在这set一些其他值
return bookDto;
});
总结:
- 适用于需要根据某值(比如主键bookId)查询其他相关类中的数据时使用,比如BookInfo
- 如果直接使用Book就可以封装好BookDto,就可以不这么做,直接使用foreach或者在stream流中直接使用Book对象就行。