вы можете использовать функцию map для потоков
List<Recipe> list = ... //however you get your original list
List<RecipeDTO> dtos = list.stream().map(mapper::convert).collect(Collectors.toList);
Я предполагаю, что ваш метод mapstruct называется "convert", а переменная mapper называется "mapper"
Карта списка будет вызывать данный метод (mapper :: convert) для каждой записи в потоке, и поток впоследствии будет содержать все возвращаемые значения всех вызовов этого метода.так что в вашем случае: он преобразует каждую запись вашего списка, и после этого список будет содержать все преобразованные элементы
После этого вам нужно будет только снова собрать поток, поэтому у вас снова есть список
после вашего редактирования этот ответ больше не действителен, потому что вы изменили вопрос и уже использовали мой ответ.
На ваш дополнительный вопрос: для преобразования вложенных бинов в целом: до тех пор, пока структураиз вложенных bean-компонентов идентичны, mapstruct сделает работу из коробки.Если у вас есть различия, вы должны их комментировать.Я не могу сказать вам различия между вашим Ingrediant и IngrediantDTO, не видя эту часть вашего кода.
Вы можете попробовать посмотреть в сгенерированном классе и взглянуть на строку, которая вызывает исключение NullPointerException.Итак, у вас есть клей, в чем разница.А затем аннотируйте это в интерфейсе mapper
Для вложенных bean-компонентов в целом: 1) вы можете добавить интерфейсный метод "componentToIngredientDTO" в ваш mapper.и аннотировать различия (если необходимо) прямо к этому методу.MapStruct будет использовать его для метода recipeToRecipeDTO!2) вы можете комментировать вложенные различия.Например, @Mapping (source = "ингридиенты.nameA", target = "ингридиентыDTOSet.nameB")
Но вы задаете сейчас совершенно другой вопрос, чем в начале, и чтобы ответить на него, мне потребуется многоДополнительная информация.Поэтому я бы предпочел переосмыслить его на исходный вопрос.И спросите нового с достаточной информацией, если моих подсказок было недостаточно