Ответ 1
Java 8 способ сделать это: -
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
Представьте, что у меня есть список определенных объектов:
List<Student>
И мне нужно создать еще один список, включая ids
Students
в приведенном выше списке:
List<Integer>
Избегая использования цикла, возможно ли достичь этого с помощью коллекций apache или guava?
Какие методы должны быть полезны для моего случая?
Java 8 способ сделать это: -
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
С помощью Guava вы можете использовать функцию типа -
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
и вы можете использовать эту функцию для преобразования списка учеников в идентификаторы типа -
Lists.transform(studentList, StudentToId.INSTANCE);
Конечно, он будет зацикливаться, чтобы извлечь все идентификаторы, но помните, что методы guava возвращают представление, а функция будет применяться только при попытке выполнить итерацию по List<Integer>
Если вы не итерации, он никогда не применит цикл.
Примечание. Помните, что это представление, и если вы хотите повторять несколько раз, лучше скопировать содержимое в другой List<Integer>
, например
ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
Благодаря Premraj для альтернативной опции cool, upvoted.
Я использовал apache CollectionUtils и BeanUtils. Соответственно, я удовлетворен выполнением следующего кода:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList,
new BeanToPropertyValueTransformer("id"));
Стоит отметить, что я сравню производительность guava (Premraj) и collectionUtils, которые я использовал выше, и решим более быстрый.
Решение для выражения лямбда Java 8:
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
Если кто-то попадет сюда через несколько лет:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
Математически невозможно сделать это без цикла. Чтобы создать отображение F, дискретного набора значений в другой дискретный набор значений, F должен работать на каждом элементе исходного набора. (Для этого требуется цикл.)
Сказанное:
Зачем вам нужен новый список? Вы можете приближаться к любой проблеме, которую вы решаете не так.
Если у вас есть список Student
, вы можете пройти всего лишь на один-два шага, когда итерации через этот список, от повторения по I.D. номера учеников.
for(Student s : list)
{
int current_id = s.getID();
// Do something with current_id
}
Если у вас другая проблема, добавьте комментарий/обновите вопрос, и мы постараемся вам помочь.