Лучшая практика для преобразования объекта списка в список objectDto Java - PullRequest
0 голосов
/ 02 июля 2019

Я получил все мои данные и преобразовал из объекта в 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"
    }
]

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Вместо того, чтобы заново изобретать колесо и писать его самостоятельно, лучше использовать существующую библиотеку / инструмент, который предназначен для этого.

Я бы порекомендовал использовать ModelMapper , которая является отличной библиотекой для отображения DTO / сущностей, вам просто понадобится одна строка для преобразования вашей сущности в DTO, что-то вроде:

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

Вы можете проверить библиотеки Примеры page или Преобразование сущности в DTO для Spring REST API учебное пособие , чтобы углубиться в эту библиотеку.

0 голосов
/ 02 июля 2019

Во-первых, этот код:

} 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, чтобы избежать записишаблонный код.

Весь этот вопрос выглядит как задание для проверки кода.Не так ли?

...