diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml
index aaf63a2b2a..51e2d6e0ee 100644
--- a/core-java-modules/core-java-collections-4/pom.xml
+++ b/core-java-modules/core-java-collections-4/pom.xml
@@ -20,10 +20,16 @@
commons-lang
${commons-lang.version}
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
2.2
+ 3.12.0
-
\ No newline at end of file
+
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java
index a9e7bc8a38..83466a7208 100644
--- a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/Employee.java
@@ -2,8 +2,11 @@ package com.baeldung.collections.sorting;
import java.util.Date;
+import javax.annotation.Nonnull;
+
public class Employee implements Comparable{
+ @Nonnull
private String name;
private Date joiningDate;
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java
new file mode 100644
index 0000000000..a5126f6057
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CheckFieldsOneByOne.java
@@ -0,0 +1,15 @@
+package com.baeldung.collections.sorting.multiple;
+
+import java.util.Comparator;
+
+
+public class CheckFieldsOneByOne implements Comparator {
+ @Override
+ public int compare(Person o1, Person o2) {
+ int nameCompare = o1.getName().compareTo(o2.getName());
+ if(nameCompare != 0) {
+ return nameCompare;
+ }
+ return Integer.compare(o1.getAge(), o2.getAge());
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java
new file mode 100644
index 0000000000..33cb9c5803
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparatorLambda.java
@@ -0,0 +1,10 @@
+package com.baeldung.collections.sorting.multiple;
+
+import java.util.Comparator;
+
+public class ComparatorLambda {
+ public static Comparator createEmployeeComparator() {
+ return Comparator.comparing(Person::getName)
+ .thenComparing(Person::getAge);
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java
new file mode 100644
index 0000000000..7ca32c5aff
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/CompareToBuilderExample.java
@@ -0,0 +1,15 @@
+package com.baeldung.collections.sorting.multiple;
+
+import java.util.Comparator;
+
+import org.apache.commons.lang3.builder.CompareToBuilder;
+
+public class CompareToBuilderExample implements Comparator {
+ @Override
+ public int compare(Person o1, Person o2) {
+ return new CompareToBuilder()
+ .append(o1.getName(), o2.getName())
+ .append(o1.getAge(), o2.getAge())
+ .build();
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java
new file mode 100644
index 0000000000..7b586a43bd
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/ComparisonChainExample.java
@@ -0,0 +1,15 @@
+package com.baeldung.collections.sorting.multiple;
+
+import java.util.Comparator;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Ordering;
+
+public class ComparisonChainExample implements Comparator {
+ @Override
+ public int compare(Person o1, Person o2) {
+ return ComparisonChain.start()
+ .compare(o1.getName(), o2.getName(), Ordering.natural().nullsFirst())
+ .compare(o1.getAge(), o2.getAge()).result();
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java
new file mode 100644
index 0000000000..08ba7bc965
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/sorting/multiple/Person.java
@@ -0,0 +1,29 @@
+package com.baeldung.collections.sorting.multiple;
+
+public class Person {
+ private String name;
+ private int age;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ // getters and setters
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java
new file mode 100644
index 0000000000..4608730567
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/sorting/multiple/ComparatorsUnitTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.collections.sorting.multiple;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+
+public class ComparatorsUnitTest {
+ @Test
+ public void givenPersonsList_whenComparedOnTwoFields_thenReturnCorrectOrder() {
+ Person person1 = new Person("John", 21);
+ Person person2 = new Person("Tom", 20);
+ // Another employee named John
+ Person person3 = new Person("John", 22);
+
+ List> comparators =
+ Arrays.asList(new CheckFieldsOneByOne(),
+ new ComparisonChainExample(),
+ new CompareToBuilderExample(),
+ ComparatorLambda.createEmployeeComparator());
+ // All comparators should produce the same result
+ for(Comparator comparator : comparators) {
+ Assertions.assertIterableEquals(
+ Arrays.asList(person1, person2, person3)
+ .stream()
+ .sorted(comparator)
+ .collect(Collectors.toList()),
+ Arrays.asList(person1, person3, person2));
+ }
+ }
+}