Finding Max and Min from List using Streams

Learn to find min and max values from a List using Stream API e.g. a date, number, Char, String or an object. We will use the Comparator.comparing() for custom comparison logic.

1. Overview

We will be using the following functions to find the max and min values from the stream:

  • Stream.max(comparator) : It is a terminal operation that returns the maximum element of the stream according to the provided Comparator.
  • Stream.min(comparator) : It is a terminal operation that returns the minimum element of the stream according to the provided Comparator.

2. Finding Min or Max Date

To get max or min date from a stream of dates, you can use Comparator.comparing( LocalDate::toEpochDay ) Comparator. The toEpochDay() function returns the count of days since epoch i.e. 1970-01-01.

LocalDate start = LocalDate.now();
LocalDate end = LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
 
//Create stream of dates
List<LocalDate> dates = Stream.iterate(start, date -> date.plusDays(1))
                .limit(ChronoUnit.DAYS.between(start, end))
                .collect(Collectors.toList());
 
// Get Min or Max Date
LocalDate maxDate = dates.stream()
              .max( Comparator.comparing( LocalDate::toEpochDay ) )
              .get();
 
LocalDate minDate = dates.stream()
              .min( Comparator.comparing( LocalDate::toEpochDay ) )
              .get();

Use the above program to find the earliest date or latest date from a list of dates.

3. Find Min or Max Number

To find min and max numbers from the stream of numbers, use Comparator.comparing( Integer::valueOf ) like comparators. The below example is for a stream of Integers.

// Get Min or Max Number
Integer maxNumber = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
          .max(Comparator.comparing(Integer::valueOf))
          .get();
 
Integer minNumber = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
          .min(Comparator.comparing(Integer::valueOf))
          .get();

4. Find Min or Max Char or String

To find min and max string or char from a stream of chars, use Comparator.comparing( String::valueOf ) like comparators.

// Get Min or Max String/Char
String maxChar = Stream.of("H", "T", "D", "I", "J")
            .max(Comparator.comparing(String::valueOf))
            .get();
 
String minChar = Stream.of("H", "T", "D", "I", "J")
            .min(Comparator.comparing(String::valueOf))
            .get();

5. Find Min or Max Object by Field Value

The Object comparison involves creating our own custom comparator, first. For example, if I want to get the youngest employee from a stream of Employee objects, then my comparator will look like Comparator.comparing(Employee::getAge). Now use this comparator to get max or min employee object.

Java program to find max or min employee object by their age.

Find max or min object by object property
List<Employee> employees = new ArrayList<Employee>();

//add few employees
 
Comparator<Employee> comparator = Comparator.comparing( Employee::getAge );
 
// Get Min or Max Object
Employee minObject = employees.stream().min(comparator).get();
Employee maxObject = employees.stream().max(comparator).get();

6. Conclusion

In this tutorial, we learned to find max value or min value from a list using the Java stream API and lambda expression. We also learned to find max or min objects such as max Date or String.

We also learned to find the max object by object property from the stream of objects.

Happy Learning !!

Sourcecode on Github

Was this post helpful?

Join 7000+ Awesome Developers

Get the latest updates from industry, awesome resources, blog updates and much more.

* We do not spam !!

7 thoughts on “Finding Max and Min from List using Streams”

    • See if it helps.

      List&lt;Integer&gt; list = Arrays.asList(1,3,4,5,2,8,9,3,6,10,23,2,5);
      
      Optional&lt;Integer&gt; value = list.stream()
      							.sorted(Collections.reverseOrder())
      							.limit(2)
      							.skip(1)
      							.findFirst();
      
      System.out.println(value);
      
      Reply
  1. Is there any way if we want our comparator object to be capable of using more than 1 property of the Employee object so that we can sort the elements based on multiple properties rather than only 1 property.

    Reply

Leave a Comment

HowToDoInJava

A blog about Java and related technologies, the best practices, algorithms, and interview questions.