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.6 answers
Java 8 sposób na to:-
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
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));
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.
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());
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"));
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.
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