【问题标题】:Best practice to convert list object to list objectDto java将列表对象转换为列表 objectDto java 的最佳实践
【发布时间】:2019-07-02 06:59:26
【问题描述】:

我已经完成了获取所有数据并从 object 转换为 objectDto。但是,不知何故,我觉得我的代码还不够好。在这里我需要你的帮助,我需要任何参考/建议来使我的代码更好(在性能方面)。这是我的工作代码:

    @Override
    public List<BookDto> findAll() throws Exception {
        try {
            List<Book> list = bookDao.findAll();
            List<BookDto> listDto = new ArrayList<>();

            for (Book book : list) {
                BookDto bookDto = new BookDto();
                Set<AuthorDto> listAuthorDto = new HashSet<AuthorDto>();
                Set<Author> dataAuthor = new HashSet<Author>();
                book.getAuthor().iterator().forEachRemaining(dataAuthor::add);

                BeanUtils.copyProperties(book, bookDto, "author", "category");
                bookDto.setCategory(book.getCategory().getCategory());

                for (Author author : dataAuthor) {
                    AuthorDto authorDto = new AuthorDto();
                    BeanUtils.copyProperties(author, authorDto);
                    listAuthorDto.add(authorDto);
                }

                bookDto.setAuthor(listAuthorDto);
                listDto.add(bookDto);
            }
            return listDto;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

这是我需要的输出(已经用上面的代码实现了):

[
    {
        "title": "book1",
        "year": "2013",
        "author": [
            {
                "name": "john",
                "address": "NY"
            },
            {
                "name": "angel",
                "address": "LA"
            }
        ],
        "category": "science"
    },
    {
        "title": "book2",
        "year": "2014",
        "author": [
            {
                "name": "john",
                "address": "NY"
            }
        ],
        "category": "science"
    },
    {
        "title": "book3",
        "year": "2009",
        "author": [
            {
                "name": "angel",
                "address": "LA"
            }
        ],
        "category": "comedy"
    }
]

【问题讨论】:

  • 可能使用一些现有的库,例如“Gson”,将完全消除您自定义代码中的任何需求。
  • 您可以使用模型映射器之类的库。

标签: java spring spring-boot entity dto


【解决方案1】:

与其重新发明轮子并自己编写,不如使用现有的库/工具,这是为此而设计的。

我建议使用ModelMapper,这是一个用于 DTO/实体映射的出色库,您只需一行即可将实体转换为 DTO,如下所示:

ModelMapper modelMapper = new ModelMapper();
BookDto bookDTO = modelMapper.map(book, BookDto.class);

您可以查看library's Examples pageEntity To DTO Conversion for a Spring REST API tutorial 以深入了解此库。

【讨论】:

  • 我更喜欢mapstruct,因为可以看到映射和代码后处理后的代码生成结果。
  • 好吧,它们有几种方法,我们只需要选择合适的一种即可;)
【解决方案2】:

首先,这段代码:

} catch (Exception e) {
   throw new Exception(e);
}

太荒谬了,我建议不要向任何人展示这段代码。

第二个-

List<Book> list = bookDao.findAll();
List<BookDto> listDto = new ArrayList<>(); 

您可以在此处分配具有确切大小的 listDto,因为您 list.size() == listDto.size(),并且在您知道确切大小或目标集合的所有其他地方,您可能必须使用它。 (对于哈希集也要注意负载因子)。

BeanUtils.copyProperties(

这里使用了不必要的反射,直接调用方法会获得性能提升。

如果您想要更多 - 您可以考虑替换使用哈希集来查找唯一作者,可能有更有效的方法来做到这一点。

作为一般建议,您可能希望使用http://mapstruct.org/documentation/stable/reference/html/ 将实体映射到 dto,以避免编写样板代码。

所有这些问题看起来都像是代码审查的任务。不是吗?

【讨论】:

  • 为什么这很荒谬?我认为跟踪错误可能有用...?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2019-01-17
相关资源
最近更新 更多