Можно ли клонировать имена из списка в конкретный массив без создания цикла?

У меня есть 35 категорий внутри этого списка List<CategoriesModel> categoriesModelList;, и я хочу клонировать все имена и поместить их в этот массив String[] namesList, в настоящее время я клонирую имена, используя этот код, но я хочу спросить, есть ли какой-либо метод, который может клонировать имена из списка в конкретный массив без создания цикла?

String[] namesList = new String[categoriesModelList.size()];
for (int i = 0; i < categoriesModelList.size(); i++)
    namesList[i] = categoriesModelList.get(i).getName();

РубрикиModel.java

public class CategoriesModel {

    private int id;
    private String name;
    private boolean supportSubcategories;

    public CategoriesModel(int id, String name, boolean supportSubcategories) {
        this.id = id;
        this.name = name;
        this.supportSubcategories = supportSubcategories;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public boolean isSupportSubcategories() {
        return supportSubcategories;
    }

}
categoriesModelList.stream().map(CategoriesModel::getName).t‌​oArray(String[]::new‌​).
Joachim Sauer 19.03.2022 12:27

Обратите внимание, что любое решение этого может только Спрятать цикла внутри какого-либо другого кода, но принципиально невозможно добиться этого без повторения каждого элемента.

Joachim Sauer 19.03.2022 12:28

@JoachimSauer Спасибо за ваш ответ, мое приложение для Android нацелено на API level 21 и выше, но метод stream добавлен в API level 24. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream?

SC291 19.03.2022 12:37

Прочтите принятый ответ на вопрос, на который вы ссылались, полностью: теперь вы можете использовать потоки с любым уровнем API благодаря дешугарингу.

Joachim Sauer 19.03.2022 22:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы можете использовать поток:

String[] namesList = categoriesModelList.stream()
    .map(CategoriesModel::getName)
    .toArray(String[]::new);

Спасибо за ваш ответ. Мое приложение для Android нацелено на API level 21 и выше, но метод stream добавлен в API level 24. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream?

SC291 19.03.2022 12:36

Если вы не можете использовать потоки, вы можете застрять в циклах, что на самом деле не так уж и плохо.

Tim Biegeleisen 19.03.2022 12:42

В этой ситуации я буду использовать метод stream для устройств, нацеленных на API level 24 и выше, и я буду использовать цикл для устройств, нацеленных на 21, 22, and 23. Все ответы правильные, но я выберу ваш ответ как правильный в зависимости от даты публикации.

SC291 19.03.2022 12:53

в любом случае вы должны использовать операцию цикла.
но поток более элегантный.

String[] namesList = categoriesModelList.stream()
                .map(CategoriesModel::getName)
                .toArray(String[]::new);

ааа мой плохой. Спасибо что сказал мне

Joonseo Lee 19.03.2022 12:28

Спасибо за ваш ответ. Мое приложение для Android нацелено на API level 21 и выше, но метод stream добавлен в API level 24. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream?

SC291 19.03.2022 12:36

Используйте java.util.stream для этого:

String[] names = categoriesModelList.stream()
     .map(category -> category.getName())
     .collect(Collectors.toList())
     .toArray(new String[]{});

Другой вариант избежать stream():

List<String> namesList = new LinkedList<>();
categoriesModelList.forEach(category -> namesList.add(category.getName()));
String[] names = namesList.toArray(new String[]{});

Но это всего лишь обходной путь

Зачем делать category -> category.getName(), если его можно упростить до двойного двоеточия?

MorganS42 19.03.2022 12:31

Это для лучшего понимания новичком в Streams и статических ссылках.

tohhant 19.03.2022 12:32

@ MorganS42 MorganS42 разница по существу не имеет значения. С другой стороны, вы могли уловить collect(toList()).toArray(...), что должно быть просто toArray(...).

Andy Turner 19.03.2022 12:33

Спасибо за ваш ответ. Мое приложение для Android нацелено на API level 21 и выше, но метод stream добавлен в API level 24. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream?

SC291 19.03.2022 12:36

Это более ресурсоемко, но, как я уже сказал, новый человек в статических ссылках и лямбдах может быть сбит с толку.

tohhant 19.03.2022 12:39

@SC291 Я добавил немного некрасиво, но решение без stream()

tohhant 19.03.2022 12:57

@tohhant Посмотрите на этот метод setItems в документации по Android. Он принимает единственный массив в качестве параметра. Спасибо за ваше время и +1 за ваши усилия :)

SC291 19.03.2022 13:04

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