У меня есть 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;
}
}
Обратите внимание, что любое решение этого может только Спрятать цикла внутри какого-либо другого кода, но принципиально невозможно добиться этого без повторения каждого элемента.
@JoachimSauer Спасибо за ваш ответ, мое приложение для Android нацелено на API level 21
и выше, но метод stream
добавлен в API level 24
. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream
?
Прочтите принятый ответ на вопрос, на который вы ссылались, полностью: теперь вы можете использовать потоки с любым уровнем API благодаря дешугарингу.
Вы можете использовать поток:
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
?
Если вы не можете использовать потоки, вы можете застрять в циклах, что на самом деле не так уж и плохо.
В этой ситуации я буду использовать метод stream
для устройств, нацеленных на API level 24
и выше, и я буду использовать цикл для устройств, нацеленных на 21, 22, and 23
. Все ответы правильные, но я выберу ваш ответ как правильный в зависимости от даты публикации.
в любом случае вы должны использовать операцию цикла.
но поток более элегантный.
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
?
Используйте 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(), если его можно упростить до двойного двоеточия?
Это для лучшего понимания новичком в Streams и статических ссылках.
@ MorganS42 MorganS42 разница по существу не имеет значения. С другой стороны, вы могли уловить collect(toList()).toArray(...)
, что должно быть просто toArray(...)
.
Спасибо за ваш ответ. Мое приложение для Android нацелено на API level 21
и выше, но метод stream
добавлен в API level 24
. Пожалуйста, посмотрите на этот вопрос Можно ли использовать Java 8 Stream API на Android API < 24? Есть ли альтернативный способ заменить метод stream
?
Это более ресурсоемко, но, как я уже сказал, новый человек в статических ссылках и лямбдах может быть сбит с толку.
@SC291 Я добавил немного некрасиво, но решение без stream()
@tohhant Посмотрите на этот метод setItems в документации по Android. Он принимает единственный массив в качестве параметра. Спасибо за ваше время и +1 за ваши усилия :)
categoriesModelList.stream().map(CategoriesModel::getName).toArray(String[]::new)
.