Java - Get the minimum and maximum values of a stream

Introduction

To get the minimum and maximum values of a stream, use the min() and max() methods of the specific stream.

These methods in the Stream<T> interface take a Comparator as argument and return an Optional<T>.

These methods do not take any arguments in IntStream, LongStream, and DoubleStream interfaces and return OptionalInt, OptionalLong, and OptionalDouble, respectively.

The following code prints the details of the highest earner in a list of people:

Optional<Person> person = Person.persons()
                                .stream()
                                .max(Comparator.comparingDouble(Person::getIncome));

Demo

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

public class Main {
  public static void main(String[] args) {
    Optional<Person> person = 
        Person.persons()//from w  w w  . j  ava  2  s  .com
        .stream()
        .max(Comparator.comparingDouble(Person::getIncome));
    if (person.isPresent()) {
      System.out.println("Highest earner: " + person.get());
    } else {
      System.out.println("Could not get the highest earner.");
    }
  }
}

class Person {
  // An enum to represent the gender of a person
  public static enum Gender {
    MALE, FEMALE
  }

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

  public Person(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<Person> persons() {
    Person ken = new Person(1, "Java", Gender.MALE, LocalDate.of(1970, Month.MAY, 4), 6020.0);
    Person jeff = new Person(2, "Jack", Gender.MALE, LocalDate.of(1970, Month.JULY, 15), 7320.0);
    Person donna = new Person(3, "Javascript", Gender.FEMALE, LocalDate.of(1972, Month.JULY, 29), 8720.0);
    Person chris = new Person(4, "XML", Gender.MALE, LocalDate.of(1993, Month.DECEMBER, 16), 5800.0);
    Person laynie = new Person(5, "Json", Gender.FEMALE, LocalDate.of(2002, Month.DECEMBER, 13), 0.0);
    Person lee = new Person(6, "Database", Gender.MALE, LocalDate.of(2011, Month.MAY, 9), 2400.0);

    // Create a list of persons
    List<Person> persons = Arrays.asList(ken, jeff, donna, chris, laynie, lee);

    return persons;
  }

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

Result

Related Topic