Sorting Operations

Sorting operations in Java Streams allow you to arrange elements in a specific order based on natural ordering or a custom comparator. Sorting is crucial for organizing data in a predictable manner, which is often necessary for further processing or displaying results.

1. Default Sorting with sorted()

The sorted() method sorts elements in their natural order (if they implement Comparable).

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
        List<Integer> sortedNumbers = numbers.stream()
                                             .sorted()
                                             .collect(Collectors.toList());
        System.out.println(sortedNumbers); // Output: [1, 2, 5, 8, 9]
    }
}

2. Custom Sorting with sorted(Comparator)

You can provide a Comparator to define custom sorting logic.

import java.util.*;
import java.util.stream.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
        List<Integer> descendingOrder = numbers.stream()
                                               .sorted(Comparator.reverseOrder())
                                               .collect(Collectors.toList());
        System.out.println(descendingOrder); // Output: [9, 8, 5, 2, 1]
    }
}

3. Sorting Objects by Specific Fields

For custom objects, use Comparator.comparing() to sort by a specific field.

import java.util.*;
import java.util.stream.*;

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
    @Override
    public String toString() { return name + "(" + age + ")"; }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Mahesh", 25),
            new Person("Paani", 20),
            new Person("Datta", 30)
        );

        // Sort by age
        List<Person> sortedByAge = people.stream()
                                         .sorted(Comparator.comparing(Person::getAge))
                                         .collect(Collectors.toList());
        System.out.println(sortedByAge); // Output: [Paani(20),Mahesh(25),Datta(30)]

        // Sort by name (lexicographically)
        List<Person> sortedByName = people.stream()
                                          .sorted(Comparator.comparing(Person::getName))
                                          .collect(Collectors.toList());
        System.out.println(sortedByName); // Output: [Datta(30), Mahesh(25), Paani(20)]
    }
}

4. Chaining Multiple Comparators

To sort by multiple fields, chain comparators using thenComparing().

List<Person> sortedByAgeThenName = people.stream()
                                         .sorted(Comparator.comparing(Person::getAge)
                                                           .thenComparing(Person::getName))
                                         .collect(Collectors.toList());Code language: PHP (php)

5. Handling Nulls

To handle null values in the stream, use Comparator.nullsFirst() or Comparator.nullsLast().

List<String> names = Arrays.asList("Raj", null, "Lakshman", null);
List<String> sortedWithNullsLast = names.stream()
                                        .sorted(Comparator.nullsLast(Comparator.naturalOrder()))
                                        .collect(Collectors.toList());
System.out.println(sortedWithNullsLast); // Output: [Lakshman, Raj, null, null]Code language: JavaScript (javascript)

6. Performance Considerations

  • Intermediate operation: sorted() is a stateful intermediate operation, meaning it needs to process the entire stream before passing it to the next operation.
  • Cost: Sorting has a time complexity of O(n log n).
  • Parallel streams: Use parallelStream() for large datasets, but ensure thread safety for custom comparators.
List<Integer> parallelSorted = numbers.parallelStream()
                                      .sorted()
                                      .collect(Collectors.toList());Code language: HTML, XML (xml)

7. Common Use Cases

Filtering and sorting: Combine filter() with sorted() for selective sorting.

List<Integer> evenSorted = numbers.stream()
                                  .filter(n -> n % 2 == 0)
                                  .sorted()
                                  .collect(Collectors.toList());
// Output: [2, 8]Code language: PHP (php)

Distinct and sorted: Remove duplicates and sort.

List<Integer> uniqueSorted = numbers.stream()
                                    .distinct()
                                    .sorted()
                                    .collect(Collectors.toList());Code language: HTML, XML (xml)

Sorting operations in Java Streams provide a straightforward yet powerful way to organize data according to specified criteria, making them indispensable for tasks requiring ordered data sets in Java programming.

Scroll to Top