Лучшая практика для преобразования объекта списка в список objectDto java

Я получил все свои данные и преобразовал объект в 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» вообще устранит необходимость в вашем пользовательском коде.

sklott 02.07.2019 09:03

Вы можете использовать библиотеку, такую ​​как сопоставитель моделей.

Abhijeet Farakate 02.07.2019 09:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
10 938
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

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

Я предпочитаю mapstruct из-за возможности увидеть результат генерации кода после отображения и постобработки кода.

Dzmitry Prakapenka 02.07.2019 09:24

Ну, есть несколько способов сделать это, нам просто нужно выбрать подходящий ;)

cнŝdk 02.07.2019 09:27

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

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

смешно, я бы посоветовал никому не показывать этот код.

Второй -

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

здесь вы можете выделить listDto с точным размером, так как вы list.size() == listDto.size(), и в любом другом месте, когда вы знаете точный размер или целевую коллекцию, вам, возможно, придется использовать его. (Для набора хэшей также обратите внимание на коэффициент загрузки).

BeanUtils.copyProperties(

использует здесь ненужное отражение, прямой вызов методов повысит производительность.

Если вы хотите большего - вы можете рассмотреть возможность замены с помощью Hash-наборов для поиска уникальных авторов, возможно, есть более эффективный способ сделать это.

И в качестве общего предложения вы можете использовать http://mapstruct.org/documentation/stable/reference/html/ для сопоставления объектов с dto, чтобы избежать написания шаблонного кода.

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

почему смешно? Я подумал, что может быть полезно отследить ошибку...?

Akza 02.07.2019 09:25

Другие вопросы по теме