Jak utworzyć nową listę z właściwością obiektu, który znajduje się na innej liście

Wyobraź sobie, że mam listę pewnych obiektów:

List<Student>

I muszę wygenerować kolejną listę zawierającą identyfikatory uczniów z powyższej listy:

List<Integer>

Unikanie używania pętli, czy można to osiągnąć używając zbiorów apache lub guava? Jakie metody powinny być przydatne w moim przypadku?

Każda pomoc będzie mile widziana, dzięki.
Author: Javatar, 2012-06-11

6 answers

Java 8 sposób na to:-

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
 124
Author: Kaushik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 18:54:02

Z Guava można użyć funkcji jak-

private enum StudentToId implements Function<Student, Integer> {
        INSTANCE;

        @Override
        public Integer apply(Student input) {
            return input.getId();
        }
    }

I możesz użyć tej funkcji, aby przekonwertować listę uczniów na Id jak -

Lists.transform(studentList, StudentToId.INSTANCE);

Z pewnością będzie to pętla w celu wyodrębnienia wszystkich identyfikatorów, ale pamiętaj, że metody guava zwracają widok i funkcja zostanie zastosowana tylko podczas próby iteracji nad List<Integer>
Jeśli nie iterujesz, nigdy nie zastosuje pętli.

Uwaga: Pamiętaj, że jest to widok i jeśli chcesz powtarzać wiele razy, lepiej będzie skopiować treść w innych List<Integer> Jak

ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
 37
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 12:18:44

Podziękowania dla Premraj za alternatywną opcję cool, upvoted.

Używałem Apache CollectionUtils i BeanUtils. W związku z tym jestem zadowolony z wykonania następującego kodu:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

Warto wspomnieć, że porównam wydajność guava (Premraj pod warunkiem) i collectionUtils użyłem powyżej, i zdecydować się na szybszy.

 18
Author: Javatar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 16:45:33

Java 8 lambda expression solution:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
 5
Author: Vijay Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 12:20:50

Jeśli ktoś tu dotrze po kilku latach:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
 2
Author: Jonathan Perrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-14 02:55:56

Matematycznie niemożliwe jest zrobienie tego bez pętli. Aby utworzyć odwzorowanie, F, dyskretnego zbioru wartości do innego dyskretnego zbioru wartości, F musi działać na każdym elemencie w pochodzącym zbiorze. (Do tego potrzebna jest pętla.)

To powiedziane:

Po co Ci nowa lista? Możesz podejść do każdego problemu, który rozwiązujesz w niewłaściwy sposób.

Jeśli masz listę Student, to jesteś o krok lub dwa dalej, gdy iteracja przez tę listę, od powtórzenia numerów IDENTYFIKACYJNYCH uczniów.

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

Jeśli masz inny problem, skomentuj / zaktualizuj pytanie, a my postaramy się ci pomóc.

 -5
Author: Zéychin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 07:52:36