Wyobraź sobie, że mam listę pewnych obiektów:
List<Student>
Muszę wygenerować kolejną listę zawierającą elementy ids
z Students
powyższej listy:
List<Integer>
Unikając pętli, czy można to osiągnąć za pomocą kolekcji apache lub guawy ?
Które metody powinny być przydatne w moim przypadku?
java
list
collections
java-stream
guava
Javatar
źródło
źródło
Odpowiedzi:
Java 8 jak to zrobić: -
źródło
Dzięki guawie możesz użyć funkcji, takich 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 do konwersji listy uczniów na identyfikatory, takie jak -
Z pewnością zapętli się, aby wyodrębnić wszystkie identyfikatory, ale pamiętaj, że metody guawy zwracają widok, a funkcja zostanie zastosowana tylko wtedy, gdy spróbujesz iterować po
List<Integer>
pętli Jeśli nie wykonasz iteracji, nigdy nie zastosuje pętli.
Uwaga: Pamiętaj, to jest widok, a jeśli chcesz iteracyjne wiele razy, że będzie lepiej, aby skopiować zawartość w jakiś inny
List<Integer>
podobnyźródło
Dzięki Premraj za alternatywną opcję fajną, przegłosowaną.
Użyłem apache CollectionUtils i BeanUtils. W związku z tym jestem zadowolony z działania następującego kodu:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, new BeanToPropertyValueTransformer("id"));
Warto wspomnieć, że porównuję wydajność guawy ( dostarczonej przez Premraj ) z narzędziami z kolekcji, których użyłem powyżej i zdecyduję, która z nich jest szybsza.
źródło
Identifiable
który mówi, który definiujegetId()
metodę, a następnie możesz użyć tego pojedynczego wzorca pojedynczego wyliczenia, aby zwykle wyodrębnić Id.Rozwiązanie wyrażenia lambda Java 8:
źródło
Jeśli ktoś dotrze tu po kilku latach:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
źródło
Niemożliwe jest to matematycznie bez pętli. Aby stworzyć odwzorowanie F dyskretnego zbioru wartości na inny dyskretny zbiór wartości, F musi działać na każdym elemencie ze zbioru źródłowego. (Zasadniczo wymagana jest do tego pętla).
Biorąc to pod uwagę:
Dlaczego potrzebujesz nowej listy? Możesz podejść do problemu, który rozwiązujesz w niewłaściwy sposób.
Jeśli masz listę
Student
, to podczas iteracji tej listy dzieli Cię tylko krok lub dwa od iteracji po numerach 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 postaramy się Ci pomóc.
źródło