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

java list collections java-stream guava

61580 просмотра

6 ответа

2203 Репутация автора

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

List<Student>

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

List<Integer>

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

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

Автор: Javatar Источник Размещён: 11.06.2012 07:20

Ответы (6)


38 плюса

4785 Репутация автора

С 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 Размещён: 11.06.2012 07:37

-5 плюса

3185 Репутация автора

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

Что, как говорится:

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

Если у вас есть список Student, то вы можете пройти итерации по этому списку на шаг или два от перебора идентификационных номеров студентов.

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

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

Автор: Zéychin Размещён: 11.06.2012 07:52

22 плюса

2203 Репутация автора

Спасибо Premraj за альтернативный классный вариант, проголосовал.

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

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

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

Автор: Javatar Размещён: 11.06.2012 04:45

5 плюса

71 Репутация автора

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

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
Автор: Jonathan Perrotta Размещён: 14.04.2015 02:55

146 плюса

2251 Репутация автора

Решение

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

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
Автор: Kaushik Размещён: 08.05.2015 06:21

6 плюса

2398 Репутация автора

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

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
Автор: Vijay Gupta Размещён: 22.03.2017 09:04
Вопросы из категории :
32x32