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

Your email address will not be published.


*