Java Streams - Java Stream Filter








The filter operation produces a filtered stream, a subset of the input stream, whose elements evaluate to true for the specified predicate.

A predicate is a function that accepts an element and returns a boolean value.

The filtered stream has the same type as the input stream.

If the predicate evaluates to false for all elements, it produces an empty stream.

The following code uses a stream of employees and filters in only females. It maps the females to their names and prints them on the standard output.

import java.time.LocalDate;
import java.time.Month;
import java.util.Arrays;
import java.util.List;
//w  w w  .ja v a 2 s .c o m
public class Main {
  public static void main(String[] args) {
    Employee.persons()
            .stream()
            .filter(Employee::isFemale)
            .map(Employee::getName)
            .forEach(System.out::println);
  }
}

class Employee {
  public static enum Gender {
    MALE, FEMALE
  }

  private long id;
  private String name;
  private Gender gender;
  private LocalDate dob;
  private double income;

  public Employee(long id, String name, Gender gender, LocalDate dob,
      double income) {
    this.id = id;
    this.name = name;
    this.gender = gender;
    this.dob = dob;
    this.income = income;
  }

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Gender getGender() {
    return gender;
  }

  public boolean isMale() {
    return this.gender == Gender.MALE;
  }

  public boolean isFemale() {
    return this.gender == Gender.FEMALE;
  }

  public void setGender(Gender gender) {
    this.gender = gender;
  }

  public LocalDate getDob() {
    return dob;
  }

  public void setDob(LocalDate dob) {
    this.dob = dob;
  }

  public double getIncome() {
    return income;
  }

  public void setIncome(double income) {
    this.income = income;
  }

  public static List<Employee> persons() {
    Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,
        Month.JANUARY, 1), 2343.0);
    Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,
        Month.JULY, 21), 7100.0);
    Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,
        Month.MAY, 29), 5455.0);
    Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,
        Month.OCTOBER, 16), 1800.0);
    Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,
        Month.DECEMBER, 13), 1234.0);
    Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,
        Month.JUNE, 9), 3211.0);

    List<Employee> persons = Arrays.asList(p1, p2, p3, p4, p5, p6);

    return persons;
  }

  @Override
  public String toString() {
    String str = String.format("(%s, %s,  %s,  %s,  %.2f)\n", id, name, gender,
        dob, income);
    return str;
  }
}

The code above generates the following result.





Example 2

For the following code

import java.time.LocalDate;
import java.time.Month;
import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    Employee.persons()
    .stream()
    .filter(Employee::isMale)
    .filter(p ->  p.getIncome() > 5000.0)
    .map(Employee::getName)
    .forEach(System.out::println);
  }
}
...
...

We can combine the two filters to one with AND operation.

public class Main {
  public static void main(String[] args) {
    Employee.persons()
    .stream()
    .filter(p ->  p.isMale() &&   p.getIncome() > 5000.0)
    .map(Employee::getName)
    .forEach(System.out::println);
  }
}