Подтвердить что ты не робот

Как создать новый список с свойством объекта, который находится в другом списке

Представьте, что у меня есть список определенных объектов:

List<Student>

И мне нужно создать еще один список, включая ids Students в приведенном выше списке:

List<Integer>

Избегая использования цикла, возможно ли достичь этого с помощью коллекций apache или guava?

Какие методы должны быть полезны для моего случая?

4b9b3361

Ответ 1

Java 8 способ сделать это: -

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());

Ответ 2

С помощью 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));

Ответ 3

Благодаря Premraj для альтернативной опции cool, upvoted.

Я использовал apache CollectionUtils и BeanUtils. Соответственно, я удовлетворен выполнением следующего кода:

List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

Стоит отметить, что я сравню производительность guava (Premraj) и collectionUtils, которые я использовал выше, и решим более быстрый.

Ответ 4

Решение для выражения лямбда Java 8:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());

Ответ 5

Если кто-то попадет сюда через несколько лет:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));

Ответ 6

Математически невозможно сделать это без цикла. Чтобы создать отображение F, дискретного набора значений в другой дискретный набор значений, F должен работать на каждом элементе исходного набора. (Для этого требуется цикл.)

Сказанное:

Зачем вам нужен новый список? Вы можете приближаться к любой проблеме, которую вы решаете не так.

Если у вас есть список Student, вы можете пройти всего лишь на один-два шага, когда итерации через этот список, от повторения по I.D. номера учеников.

for(Student s : list)
{
    int current_id = s.getID();
    // Do something with current_id
}

Если у вас другая проблема, добавьте комментарий/обновите вопрос, и мы постараемся вам помочь.