$show=/label

Java 8 Comparator thenComparing()

SHARE:

A quick guide to use thenComparing() method of Comparator interface in java 8

1. Overview

In this tutorial, We'll learn how to use Comparator.thenComparing() method in java 8 streams.

thenComparing() method is used to sort the list of objects by multiple fields. 


And also thenComparing() method is used to merge or join two comparators as a single one. The merged comparator is used to sort the collection by multiple fields.

Syntax:
default Comparator<T> thenComparing(Comparator<? super T> other)
This method returns a lexicographic-order comparator with another comparator. If this Comparator considers two elements equal, i.e. compare(a, b) == 0, other is used to determine the order.

Java 8 Comparator thenComparing() - Sort By Multiple Fields




2. Java 8 Comparator thenComparing() Example by two fields


Look at the example that sorts the list of objects by two properties.

First, we need to have two Comparator instances created using comparing() method in java 8.

After that we need to call the thenComparing() method on the first comparator and pass the second comparator to thenComparing() method. This method returns the third comparator which is holding two fields from comparator 1 and comparator 2.

For comparing() method we need to pass the lambda expression to the comparator.

Example 1
package com.javaprogramto.java8.comparator.thencomparing;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortByTwoFieldsByThenComparing {

	public static void main(String[] args) {

		List<Author> authors = new ArrayList<>();

		authors.add(new Author(100, "Bakliwal", "R", "Shagun", 10));
		authors.add(new Author(101, "Bakliwal", "R", "Baalen", 10));
		authors.add(new Author(101, "Bakliwal", "P", "Bakliwal", 10));
		authors.add(new Author(101, "Ashish", "S", "Paradkar", 10));
		authors.add(new Author(101, "Ashish", "P", "Bakliwal", 10));
		authors.add(new Author(101, "Ashish", "S", "Ameen", 10));

		// first comparator - comparator by lamdba expression
		Comparator<Author> firstNameComparator = (a1, a2) -> a1.getFirstName().compareTo(a2.getFirstName());

		// second comparator - comparing() method by method reference
		Comparator<Author> middleNameComparator = Comparator.comparing(Author::getMiddleName);

		// thenComparing() method to merge 2 comparator
		Comparator<Author> firstMiddleNamesComparator = firstNameComparator.thenComparing(middleNameComparator);

		System.out.println("Before sorting by two fields");
		authors.forEach(a -> System.out.println(a));

		Collections.sort(authors, firstMiddleNamesComparator);

		System.out.println("after sorting merged comparator");
		authors.forEach(a -> System.out.println(a));

	}

}

class Author {
	int id;
	String firstName;
	String middleName;
	String lastName;
	int noOfBooks;

	public Author(int id, String firstName, String middleName, String lastName, int noOfBooks) {
		super();
		this.id = id;
		this.firstName = firstName;
		this.middleName = middleName;
		this.lastName = lastName;
		this.noOfBooks = noOfBooks;
	}

	public int getId() {
		return id;
	}

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

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getMiddleName() {
		return middleName;
	}

	public void setMiddleName(String middleName) {
		this.middleName = middleName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public int getNoOfBooks() {
		return noOfBooks;
	}

	public void setNoOfBooks(int noOfBooks) {
		this.noOfBooks = noOfBooks;
	}

	@Override
	public String toString() {
		return "Author [id=" + id + ", firstName=" + firstName + ", middleName=" + middleName + ", lastName=" + lastName
				+ ", noOfBooks=" + noOfBooks + "]";
	}

}

Output
Before sorting by two fields
Author [id=100, firstName=Bakliwal, middleName=R, lastName=Shagun, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=R, lastName=Baalen, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Paradkar, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Ameen, noOfBooks=10]

after sorting merged comparator
Author [id=101, firstName=Ashish, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Paradkar, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Ameen, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=100, firstName=Bakliwal, middleName=R, lastName=Shagun, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=R, lastName=Baalen, noOfBooks=10]


3. Java 8 Comparator thenComparing() Example by Three or more fields


In the below program let us sort the first, middle and last names together by 3 fields.

First, create three separate comparators using Comparator.comparing() method by passing method reference.


Next, merge all these three names comparators into a single one by using thenComparing() method chain.

Example 2
package com.javaprogramto.java8.comparator.thencomparing;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortByThreeFieldsByThenComparing {

	public static void main(String[] args) {

		List<Author> authors = new ArrayList<>();

		authors.add(new Author(100, "Bakliwal", "R", "Shagun", 10));
		authors.add(new Author(101, "Bakliwal", "R", "Baalen", 10));
		authors.add(new Author(101, "Bakliwal", "P", "Bakliwal", 10));
		authors.add(new Author(101, "Ashish", "S", "Paradkar", 10));
		authors.add(new Author(101, "Ashish", "P", "Bakliwal", 10));
		authors.add(new Author(101, "Ashish", "S", "Ameen", 10));

		// first comparator - comparing() method by method reference
		Comparator<Author> firstNameComparator = Comparator.comparing(Author::getFirstName);

		// second comparator - comparing() method by method reference
		Comparator<Author> middleNameComparator = Comparator.comparing(Author::getMiddleName);

		// second comparator - comparing() method by method reference
		Comparator<Author> lastNameComparator = Comparator.comparing(Author::getLastName);

		// thenComparing() method to merge 3 comparators in chain.
		Comparator<Author> firstMiddleNamesComparator = firstNameComparator.thenComparing(middleNameComparator)
				.thenComparing(lastNameComparator);

		System.out.println("Before sorting by 3 fields");
		authors.forEach(a -> System.out.println(a));

		Collections.sort(authors, firstMiddleNamesComparator);

		System.out.println("after sorting merged comparator");
		authors.forEach(a -> System.out.println(a));
	}
}

Output
Before sorting by 3 fields
Author [id=100, firstName=Bakliwal, middleName=R, lastName=Shagun, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=R, lastName=Baalen, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Paradkar, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Ameen, noOfBooks=10]

after sorting merged comparator
Author [id=101, firstName=Ashish, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Ameen, noOfBooks=10]
Author [id=101, firstName=Ashish, middleName=S, lastName=Paradkar, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=P, lastName=Bakliwal, noOfBooks=10]
Author [id=101, firstName=Bakliwal, middleName=R, lastName=Baalen, noOfBooks=10]
Author [id=100, firstName=Bakliwal, middleName=R, lastName=Shagun, noOfBooks=10]

From the above output, we can see that the last name is sorted properly when the first and middle names are the same. That means merged comparator using thenComparing() method is worked fine.


4. Java 8 Comparator thenComparing() Example 3


We can use list.sort() rathar than using Collections.sort() method.

Example 3
// first comparator - comparing() method by method reference
Comparator<Author> firstNameComparator = Comparator.comparing(Author::getFirstName);

// second comparator - comparing() method by method reference
Comparator<Author> middleNameComparator = Comparator.comparing(Author::getMiddleName);

// second comparator - comparing() method by method reference
Comparator<Author> lastNameComparator = Comparator.comparing(Author::getLastName);

// thenComparing() method to merge 3 comparators in chain.
Comparator<Author> fullNamesComparator = firstNameComparator.thenComparing(middleNameComparator)
.thenComparing(lastNameComparator);

authors.sort(fullNamesComparator);


This list.sort() method also produces the same output as in the above section.


5. Conclusion


In this article, We've seen how to use Comparator.thenComparing() method to sort the list of custom objects by multiple fields.

Comparator interface has a different sets of methods thenComparingDouble(), thenComparingInt() and thenComparingLong() for primitive int, double and long fields.




COMMENTS

BLOGGER

About Us

Author: Venkatesh - I love to learn and share the technical stuff.
Name

accumulo,1,ActiveMQ,2,Adsense,1,API,37,ArrayList,18,Arrays,24,Bean Creation,3,Bean Scopes,1,BiConsumer,1,Blogger Tips,1,Books,1,C Programming,1,Collection,8,Collections,37,Collector,1,Command Line,1,Comparator,1,Compile Errors,1,Configurations,7,Constants,1,Control Statements,8,Conversions,6,Core Java,149,Corona India,1,Create,2,CSS,1,Date,3,Date Time API,38,Dictionary,1,Difference,2,Download,1,Eclipse,3,Efficiently,1,Error,1,Errors,1,Exceptions,8,Fast,1,Files,17,Float,1,Font,1,Form,1,Freshers,1,Function,3,Functional Interface,2,Garbage Collector,1,Generics,4,Git,9,Grant,1,Grep,1,HashMap,2,HomeBrew,2,HTML,2,HttpClient,2,Immutable,1,Installation,1,Interview Questions,6,Iterate,2,Jackson API,3,Java,32,Java 10,1,Java 11,6,Java 12,5,Java 13,2,Java 14,2,Java 8,128,Java 8 Difference,2,Java 8 Stream Conversions,4,java 8 Stream Examples,12,Java 9,1,Java Conversions,14,Java Design Patterns,1,Java Files,1,Java Program,3,Java Programs,114,Java Spark,1,java.lang,4,java.util. function,1,JavaScript,1,jQuery,1,Kotlin,11,Kotlin Conversions,6,Kotlin Programs,10,Lambda,2,lang,29,Leap Year,1,live updates,1,LocalDate,1,Logging,1,Mac OS,3,Math,1,Matrix,6,Maven,1,Method References,1,Mockito,1,MongoDB,3,New Features,1,Operations,1,Optional,6,Oracle,5,Oracle 18C,1,Partition,1,Patterns,1,Programs,1,Property,1,Python,2,Quarkus,1,Read,1,Real Time,1,Recursion,2,Remove,2,Rest API,1,Schedules,1,Serialization,1,Servlet,2,Sort,1,Sorting Techniques,8,Spring,2,Spring Boot,23,Spring Email,1,Spring MVC,1,Streams,31,String,61,String Programs,28,String Revese,1,StringBuilder,1,Swing,1,System,1,Tags,1,Threads,11,Tomcat,1,Tomcat 8,1,Troubleshoot,26,Unix,3,Updates,3,util,5,While Loop,1,
ltr
item
JavaProgramTo.com: Java 8 Comparator thenComparing()
Java 8 Comparator thenComparing()
A quick guide to use thenComparing() method of Comparator interface in java 8
https://blogger.googleusercontent.com/img/a/AVvXsEi7bF05QtVTsLrhr1vT80PIaSoiS8glDx2fsClBs9qwhbk9YeP6y0W73wkgo5X7mEHYJBuK-He5dhNykAzLzz13ll4MzEyzfZQ7MeW4FxAZMxZ9QXNs-3OP0dv-OFaNblvZ9fY6V-9tBtJgMe2ndsZhKtYTUtINLyO9bRH7-1EiShpdLEq-PyJ-x6wH=w400-h243
https://blogger.googleusercontent.com/img/a/AVvXsEi7bF05QtVTsLrhr1vT80PIaSoiS8glDx2fsClBs9qwhbk9YeP6y0W73wkgo5X7mEHYJBuK-He5dhNykAzLzz13ll4MzEyzfZQ7MeW4FxAZMxZ9QXNs-3OP0dv-OFaNblvZ9fY6V-9tBtJgMe2ndsZhKtYTUtINLyO9bRH7-1EiShpdLEq-PyJ-x6wH=s72-w400-c-h243
JavaProgramTo.com
https://www.javaprogramto.com/2021/12/java-comparator-thencomparing.html
https://www.javaprogramto.com/
https://www.javaprogramto.com/
https://www.javaprogramto.com/2021/12/java-comparator-thencomparing.html
true
3124782013468838591
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content