Java 8 – filter
Java 8 – filter
W Javie 8 pojawiło się narzędzie Stream API które pozwala dokonywać operacji na danych w sposób efektywny np. z użyciem wątków bez konieczności obsługi ich przez programistę. Funkcja filter pozwala odflitrować elementy kolekcji. Zobaczmy to na przykładzie, zdefiniowana jest lista osób:
final List<Person> persons = Arrays.asList( new Person("Max" , 18), new Person("Peter" , 37), new Person("Pamela" , 24), new Person("David" , 33) );
Zadanie polega na odfiltrowaniu listy z elementów dla których wiek osoby jest większy niż 18 – do wersji 8 javy kod wyglądałby następująco:
List<Person> filteredList = new ArrayList<>(); for(Person person : persons) { if (person.getAge() > 18) { filteredList.add(person); } } System.out.println(filteredList);
Po posortowaniu:
Collections.sort(filteredList, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return Double.compare(o1.getAge(), o2.getAge()); } }); System.out.println(filteredList)
Używając biblioteki Guava – bardziej elastyczne rozwiązanie:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>14.0</version> </dependency>
Predicate <Person> predicateFilteredPerson = new Predicate<Person>() { @Override public boolean apply(Person person) { return person.getAge() > 18; } }; System.out.println(Iterables.filter(persons, predicateFilteredPerson));
gdzie Predicate to interfejs funkcyjny pochodzący właśnie z Guavy. Po wprowadzeniu wersji 8 kod wyglądałby następująco – jest zwięzły i czytelny:
List<Person> filteredSortListInJava8 = filteredList.stream() .filter(person -> person.getAge() > 18) .sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList()); filteredSortListInJava8.forEach(System.out::println);
Do metody filter przekazywana jest implementacja interfejsu Predicate (NIE z biblioteki Guava tylko z Javy 8) – interfejs funkcyjny zwracający wartość logiczną parametryzowany dowolnym typem:
Predicate<Person> predicateFilter = person -> person.getAge() > 18; List<Person> filteredSortListInJava8WithPredicate = filteredList.stream() .filter(predicateFilter) .sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList()); filteredSortListInJava8WithPredicate.forEach(System.out::println);
Dla każdego elementu kolekcji predykat zwraca wartość logiczną true bądź false. Na tej podstawie elementy umieszczane są w kolekcji wynikowej.
Leave a comment