Merge pull request #9224 from dupirefr/author/BAEL-3981-comparing_objects
[BAEL-3981] Comparing in Java
This commit is contained in:
		
						commit
						8c987e89c9
					
				| @ -20,7 +20,12 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.apache.commons</groupId> |             <groupId>org.apache.commons</groupId> | ||||||
|             <artifactId>commons-lang3</artifactId> |             <artifactId>commons-lang3</artifactId> | ||||||
|             <version>3.9</version> |             <version>${commons-lang3.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.google.guava</groupId> | ||||||
|  |             <artifactId>guava</artifactId> | ||||||
|  |             <version>${guava.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>commons-beanutils</groupId> |             <groupId>commons-beanutils</groupId> | ||||||
| @ -65,6 +70,8 @@ | |||||||
|         <jmh-generator.version>1.19</jmh-generator.version> |         <jmh-generator.version>1.19</jmh-generator.version> | ||||||
|         <assertj.version>3.12.2</assertj.version> |         <assertj.version>3.12.2</assertj.version> | ||||||
|         <commons.beanutils.version>1.9.4</commons.beanutils.version> |         <commons.beanutils.version>1.9.4</commons.beanutils.version> | ||||||
|  |         <commons-lang3.version>3.10</commons-lang3.version> | ||||||
|  |         <guava.version>29.0-jre</guava.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
|  | |||||||
| @ -0,0 +1,51 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | public class PersonWithEquals { | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  |     private LocalDate birthDate; | ||||||
|  | 
 | ||||||
|  |     public PersonWithEquals(String firstName, String lastName) { | ||||||
|  |         if (firstName == null || lastName == null) { | ||||||
|  |             throw new NullPointerException("Names can't be null"); | ||||||
|  |         } | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public PersonWithEquals(String firstName, String lastName, LocalDate birthDate) { | ||||||
|  |         this(firstName, lastName); | ||||||
|  | 
 | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String firstName() { | ||||||
|  |         return firstName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String lastName() { | ||||||
|  |         return lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public LocalDate birthDate() { | ||||||
|  |         return birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean equals(Object o) { | ||||||
|  |         if (this == o) return true; | ||||||
|  |         if (o == null || getClass() != o.getClass()) return false; | ||||||
|  |         PersonWithEquals that = (PersonWithEquals) o; | ||||||
|  |         return firstName.equals(that.firstName) && | ||||||
|  |           lastName.equals(that.lastName) && | ||||||
|  |           Objects.equals(birthDate, that.birthDate); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int hashCode() { | ||||||
|  |         return Objects.hash(firstName, lastName); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,62 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | public class PersonWithEqualsAndComparable implements Comparable<PersonWithEqualsAndComparable> { | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  |     private LocalDate birthDate; | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndComparable(String firstName, String lastName) { | ||||||
|  |         if (firstName == null || lastName == null) { | ||||||
|  |             throw new NullPointerException("Names can't be null"); | ||||||
|  |         } | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndComparable(String firstName, String lastName, LocalDate birthDate) { | ||||||
|  |         this(firstName, lastName); | ||||||
|  | 
 | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean equals(Object o) { | ||||||
|  |         if (this == o) return true; | ||||||
|  |         if (o == null || getClass() != o.getClass()) return false; | ||||||
|  |         PersonWithEqualsAndComparable that = (PersonWithEqualsAndComparable) o; | ||||||
|  |         return firstName.equals(that.firstName) && | ||||||
|  |           lastName.equals(that.lastName) && | ||||||
|  |           Objects.equals(birthDate, that.birthDate); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int hashCode() { | ||||||
|  |         return Objects.hash(firstName, lastName); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int compareTo(PersonWithEqualsAndComparable o) { | ||||||
|  |         int lastNamesComparison = this.lastName.compareTo(o.lastName); | ||||||
|  |         if (lastNamesComparison == 0) { | ||||||
|  |             int firstNamesComparison = this.firstName.compareTo(o.firstName); | ||||||
|  |             if (firstNamesComparison == 0) { | ||||||
|  |                 if (this.birthDate != null && o.birthDate != null) { | ||||||
|  |                     return this.birthDate.compareTo(o.birthDate); | ||||||
|  |                 } else if (this.birthDate != null) { | ||||||
|  |                   return 1; | ||||||
|  |                 } else if (o.birthDate != null) { | ||||||
|  |                     return -1; | ||||||
|  |                 } else { | ||||||
|  |                     return 0; | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 return firstNamesComparison; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             return lastNamesComparison; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,60 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Comparator; | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | public class PersonWithEqualsAndComparableUsingComparator implements Comparable<PersonWithEqualsAndComparableUsingComparator> { | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  |     private LocalDate birthDate; | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName) { | ||||||
|  |         if (firstName == null || lastName == null) { | ||||||
|  |             throw new NullPointerException("Names can't be null"); | ||||||
|  |         } | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndComparableUsingComparator(String firstName, String lastName, LocalDate birthDate) { | ||||||
|  |         this(firstName, lastName); | ||||||
|  | 
 | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String firstName() { | ||||||
|  |         return firstName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String lastName() { | ||||||
|  |         return lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public LocalDate birthDate() { | ||||||
|  |         return birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean equals(Object o) { | ||||||
|  |         if (this == o) return true; | ||||||
|  |         if (o == null || getClass() != o.getClass()) return false; | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator that = (PersonWithEqualsAndComparableUsingComparator) o; | ||||||
|  |         return firstName.equals(that.firstName) && | ||||||
|  |           lastName.equals(that.lastName) && | ||||||
|  |           Objects.equals(birthDate, that.birthDate); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int hashCode() { | ||||||
|  |         return Objects.hash(firstName, lastName); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int compareTo(PersonWithEqualsAndComparableUsingComparator o) { | ||||||
|  |         return Comparator.comparing(PersonWithEqualsAndComparableUsingComparator::lastName) | ||||||
|  |           .thenComparing(PersonWithEqualsAndComparableUsingComparator::firstName) | ||||||
|  |           .thenComparing(PersonWithEqualsAndComparableUsingComparator::birthDate, Comparator.nullsLast(Comparator.naturalOrder())) | ||||||
|  |           .compare(this, o); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,44 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | public class PersonWithEqualsAndWrongComparable implements Comparable<PersonWithEqualsAndWrongComparable> { | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  |     private LocalDate birthDate; | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndWrongComparable(String firstName, String lastName) { | ||||||
|  |         if (firstName == null || lastName == null) { | ||||||
|  |             throw new NullPointerException("Names can't be null"); | ||||||
|  |         } | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public PersonWithEqualsAndWrongComparable(String firstName, String lastName, LocalDate birthDate) { | ||||||
|  |         this(firstName, lastName); | ||||||
|  | 
 | ||||||
|  |         this.birthDate = birthDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean equals(Object o) { | ||||||
|  |         if (this == o) return true; | ||||||
|  |         if (o == null || getClass() != o.getClass()) return false; | ||||||
|  |         PersonWithEqualsAndWrongComparable that = (PersonWithEqualsAndWrongComparable) o; | ||||||
|  |         return firstName.equals(that.firstName) && | ||||||
|  |           lastName.equals(that.lastName) && | ||||||
|  |           Objects.equals(birthDate, that.birthDate); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int hashCode() { | ||||||
|  |         return Objects.hash(firstName, lastName); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int compareTo(PersonWithEqualsAndWrongComparable o) { | ||||||
|  |         return this.lastName.compareTo(o.lastName); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,11 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | public class PersonWithoutEquals { | ||||||
|  |     private String firstName; | ||||||
|  |     private String lastName; | ||||||
|  | 
 | ||||||
|  |     public PersonWithoutEquals(String firstName, String lastName) { | ||||||
|  |         this.firstName = firstName; | ||||||
|  |         this.lastName = lastName; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,59 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.lang3.ObjectUtils; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class ApacheCommonsObjectUtilsUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithSameValues_whenApacheCommonsEqualityMethods_thenEqualsTrueNotEqualsFalse() { | ||||||
|  |         String a = new String("Hello!"); | ||||||
|  |         String b = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.equals(a, b)).isTrue(); | ||||||
|  |         assertThat(ObjectUtils.notEqual(a, b)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithDifferentValues_whenApacheCommonsEqualityMethods_thenEqualsFalseNotEqualsTrue() { | ||||||
|  |         String a = new String("Hello!"); | ||||||
|  |         String b = new String("Hello World!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.equals(a, b)).isFalse(); | ||||||
|  |         assertThat(ObjectUtils.notEqual(a, b)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithConsecutiveValues_whenApacheCommonsCompare_thenNegative() { | ||||||
|  |         String first = new String("Hello!"); | ||||||
|  |         String second = new String("How are you?"); | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.compare(first, second)).isNegative(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithSameValues_whenApacheCommonsEqualityMethods_thenEqualsFalseNotEqualsTrue() { | ||||||
|  |         String first = new String("Hello!"); | ||||||
|  |         String second = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.compare(first, second)).isZero(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithConsecutiveValues_whenApacheCommonsCompareReversed_thenPositive() { | ||||||
|  |         String first = new String("Hello!"); | ||||||
|  |         String second = new String("How are you?"); | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.compare(second, first)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsOneNull_whenApacheCommonsCompare_thenPositive() { | ||||||
|  |         String first = new String("Hello!"); | ||||||
|  |         String second = null; | ||||||
|  | 
 | ||||||
|  |         assertThat(ObjectUtils.compare(first, second, false)).isPositive(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,107 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.SortedSet; | ||||||
|  | import java.util.TreeSet; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class ComparableInterfaceUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoConsecutiveStrings_whenCompareTo_thenNegative() { | ||||||
|  |         String first = "Google"; | ||||||
|  |         String second = "Microsoft"; | ||||||
|  | 
 | ||||||
|  |         assertThat(first.compareTo(second)).isNegative(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoEqualsStrings_whenCompareTo_thenZero() { | ||||||
|  |         String first = "Google"; | ||||||
|  |         String second = "Google"; | ||||||
|  | 
 | ||||||
|  |         assertThat(first.compareTo(second)).isZero(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoConsecutiveStrings_whenReversedCompareTo_thenPositive() { | ||||||
|  |         String first = "Google"; | ||||||
|  |         String second = "Microsoft"; | ||||||
|  | 
 | ||||||
|  |         assertThat(second.compareTo(first)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() { | ||||||
|  |         PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndWrongComparable joe = new PersonWithEqualsAndWrongComparable("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(joe)).isNegative(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenReversedCompareTo_thenZero() { | ||||||
|  |         PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndWrongComparable mike = new PersonWithEqualsAndWrongComparable("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(mike)).isZero(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndWrongComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() { | ||||||
|  |         PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndWrongComparable joe = new PersonWithEqualsAndWrongComparable("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.compareTo(richard)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndWrongComparableAndSameLastNames_whenSortedSet_thenProblem() { | ||||||
|  |         PersonWithEqualsAndWrongComparable richard = new PersonWithEqualsAndWrongComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndWrongComparable mike = new PersonWithEqualsAndWrongComparable("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         SortedSet<PersonWithEqualsAndWrongComparable> people = new TreeSet<>(); | ||||||
|  |         people.add(richard); | ||||||
|  |         people.add(mike); | ||||||
|  | 
 | ||||||
|  |         assertThat(people).containsExactly(richard); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenCompareTo_thenNegative() { | ||||||
|  |         PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparable joe = new PersonWithEqualsAndComparable("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(joe)).isNegative(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenReversedCompareTo_thenZero() { | ||||||
|  |         PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparable mike = new PersonWithEqualsAndComparable("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(mike)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() { | ||||||
|  |         PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparable joe = new PersonWithEqualsAndComparable("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.compareTo(richard)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableAndSameLastNames_whenSortedSet_thenProblem() { | ||||||
|  |         PersonWithEqualsAndComparable richard = new PersonWithEqualsAndComparable("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparable mike = new PersonWithEqualsAndComparable("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         SortedSet<PersonWithEqualsAndComparable> people = new TreeSet<>(); | ||||||
|  |         people.add(richard); | ||||||
|  |         people.add(mike); | ||||||
|  | 
 | ||||||
|  |         assertThat(people).containsExactly(mike, richard); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,81 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class ComparatorInterfaceUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenListOfTwoPersonWithEqualsAndComparatorByFirstName_whenSort_thenSortedByFirstNames() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals allan = new PersonWithEquals("Allan", "Dale"); | ||||||
|  | 
 | ||||||
|  |         List<PersonWithEquals> people = new ArrayList<>(); | ||||||
|  |         people.add(joe); | ||||||
|  |         people.add(allan); | ||||||
|  | 
 | ||||||
|  |         Comparator<PersonWithEquals> compareByFirstNames = new Comparator<PersonWithEquals>() { | ||||||
|  |             @Override | ||||||
|  |             public int compare(PersonWithEquals o1, PersonWithEquals o2) { | ||||||
|  |                 return o1.firstName().compareTo(o2.firstName()); | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |         people.sort(compareByFirstNames); | ||||||
|  | 
 | ||||||
|  |         assertThat(people).containsExactly(allan, joe); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenListOfTwoPersonWithEqualsAndComparatorByFirstNameFunctionalStyle_whenSort_thenSortedByFirstNames() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals allan = new PersonWithEquals("Allan", "Dale"); | ||||||
|  | 
 | ||||||
|  |         List<PersonWithEquals> people = new ArrayList<>(); | ||||||
|  |         people.add(joe); | ||||||
|  |         people.add(allan); | ||||||
|  | 
 | ||||||
|  |         Comparator<PersonWithEquals> compareByFirstNames = Comparator.comparing(PersonWithEquals::firstName); | ||||||
|  |         people.sort(compareByFirstNames); | ||||||
|  | 
 | ||||||
|  |         assertThat(people).containsExactly(allan, joe); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenCompareTo_thenNegative() { | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator joe = new PersonWithEqualsAndComparableUsingComparator("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(joe)).isNegative(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenReversedCompareTo_thenZero() { | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator mike = new PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         assertThat(richard.compareTo(mike)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndConsecutiveLastNames_whenReversedCompareTo_thenPositive() { | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator joe = new PersonWithEqualsAndComparableUsingComparator("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.compareTo(richard)).isPositive(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsAndComparableUsingComparatorAndSameLastNames_whenSortedSet_thenProblem() { | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator richard = new PersonWithEqualsAndComparableUsingComparator("Richard", "Jefferson"); | ||||||
|  |         PersonWithEqualsAndComparableUsingComparator mike = new PersonWithEqualsAndComparableUsingComparator("Mike", "Jefferson"); | ||||||
|  | 
 | ||||||
|  |         SortedSet<PersonWithEqualsAndComparableUsingComparator> people = new TreeSet<>(); | ||||||
|  |         people.add(richard); | ||||||
|  |         people.add(mike); | ||||||
|  | 
 | ||||||
|  |         assertThat(people).containsExactly(mike, richard); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,116 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class EqualityOperatorUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntsWithSameValues_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         int a = 1; | ||||||
|  |         int b = 1; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntsWithDifferentValues_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         int a = 1; | ||||||
|  |         int b = 2; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntsWithSameValuesOneWrapped_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         int a = 1; | ||||||
|  |         Integer b = new Integer(1); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntsWithDifferentValuesOneWrapped_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         int a = 1; | ||||||
|  |         Integer b = new Integer(2); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntegersWithSameValues_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         Integer a = new Integer(1); | ||||||
|  |         Integer b = new Integer(1); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntegersWithDifferentValues_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         Integer a = new Integer(1); | ||||||
|  |         Integer b = new Integer(2); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntegersWithSameReference_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         Integer a = new Integer(1); | ||||||
|  |         Integer b = a; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntegersFromValueOfWithSameValues_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         Integer a = Integer.valueOf(1); | ||||||
|  |         Integer b = Integer.valueOf(1); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithSameValues_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         String a = new String("Hello!"); | ||||||
|  |         String b = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsFromLiteralsWithSameValues_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         String a = "Hello!"; | ||||||
|  |         String b = "Hello!"; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoNullObjects_whenEqualityOperators_thenConsideredSame() { | ||||||
|  |         Object a = null; | ||||||
|  |         Object b = null; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isTrue(); | ||||||
|  |         assertThat(a != b).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoObjectsOneNull_whenEqualityOperators_thenNotConsideredSame() { | ||||||
|  |         Object a = null; | ||||||
|  |         Object b = "Hello!"; | ||||||
|  | 
 | ||||||
|  |         assertThat(a == b).isFalse(); | ||||||
|  |         assertThat(a != b).isTrue(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,73 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | import static org.junit.jupiter.api.Assertions.assertThrows; | ||||||
|  | 
 | ||||||
|  | class EqualsMethodUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoIntegersWithSameValue_whenEquals_thenTrue() { | ||||||
|  |         Integer a = new Integer(1); | ||||||
|  |         Integer b = new Integer(1); | ||||||
|  | 
 | ||||||
|  |         assertThat(a.equals(b)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithSameValue_whenEquals_thenTrue() { | ||||||
|  |         String a = new String("Hello!"); | ||||||
|  |         String b = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(a.equals(b)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoStringsWithDifferentValue_whenEquals_thenFalse() { | ||||||
|  |         String a = new String("Hello!"); | ||||||
|  |         String b = new String("Hello World!"); | ||||||
|  | 
 | ||||||
|  |         assertThat(a.equals(b)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoObjectsFirstNull_whenEquals_thenNullPointerExceptionThrown() { | ||||||
|  |         Object a = null; | ||||||
|  |         Object b = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |         assertThrows(NullPointerException.class, () -> a.equals(b)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoObjectsSecondNull_whenEquals_thenFalse() { | ||||||
|  |         Object a = new String("Hello!"); | ||||||
|  |         Object b = null; | ||||||
|  | 
 | ||||||
|  |         assertThat(a.equals(b)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithoutEqualsWithSameNames_whenEquals_thenFalse() { | ||||||
|  |         PersonWithoutEquals joe = new PersonWithoutEquals("Joe", "Portman"); | ||||||
|  |         PersonWithoutEquals joeAgain = new PersonWithoutEquals("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.equals(joeAgain)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsWithSameNames_whenEquals_thenTrue() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals joeAgain = new PersonWithEquals("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.equals(joeAgain)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWittEqualsWithDifferentNames_whenEquals_thenFalse() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(joe.equals(natalie)).isFalse(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,73 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import com.google.common.base.Objects; | ||||||
|  | import com.google.common.collect.ComparisonChain; | ||||||
|  | import com.google.common.primitives.Ints; | ||||||
|  | import org.junit.jupiter.api.Nested; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class GuavaUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Nested | ||||||
|  |     class ObjectsEqualMethod { | ||||||
|  |         @Test | ||||||
|  |         void givenTwoStringsWithSameValues_whenObjectsEqualMethods_thenTrue() { | ||||||
|  |             String a = new String("Hello!"); | ||||||
|  |             String b = new String("Hello!"); | ||||||
|  | 
 | ||||||
|  |             assertThat(Objects.equal(a, b)).isTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Test | ||||||
|  |         void givenTwoStringsWithDifferentValues_whenObjectsEqualMethods_thenFalse() { | ||||||
|  |             String a = new String("Hello!"); | ||||||
|  |             String b = new String("Hello World!"); | ||||||
|  | 
 | ||||||
|  |             assertThat(Objects.equal(a, b)).isFalse(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Nested | ||||||
|  |     class ComparisonMethods { | ||||||
|  |         @Test | ||||||
|  |         void givenTwoIntsWithConsecutiveValues_whenIntsCompareMethods_thenNegative() { | ||||||
|  |             int first = 1; | ||||||
|  |             int second = 2; | ||||||
|  |             assertThat(Ints.compare(first, second)).isNegative(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Test | ||||||
|  |         void givenTwoIntsWithSameValues_whenIntsCompareMethods_thenZero() { | ||||||
|  |             int first = 1; | ||||||
|  |             int second = 1; | ||||||
|  | 
 | ||||||
|  |             assertThat(Ints.compare(first, second)).isZero(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Test | ||||||
|  |         void givenTwoIntsWithConsecutiveValues_whenIntsCompareMethodsReversed_thenNegative() { | ||||||
|  |             int first = 1; | ||||||
|  |             int second = 2; | ||||||
|  | 
 | ||||||
|  |             assertThat(Ints.compare(second, first)).isPositive(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Nested | ||||||
|  |     class ComparisonChainClass { | ||||||
|  |         @Test | ||||||
|  |         void givenTwoPersonWithEquals_whenComparisonChainByLastNameThenFirstName_thenSortedJoeFirstAndNatalieSecond() { | ||||||
|  |             PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman"); | ||||||
|  |             PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |             int comparisonResult = ComparisonChain.start() | ||||||
|  |               .compare(natalie.lastName(), joe.lastName()) | ||||||
|  |               .compare(natalie.firstName(), joe.firstName()) | ||||||
|  |               .result(); | ||||||
|  | 
 | ||||||
|  |             assertThat(comparisonResult).isPositive(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | package com.baeldung.comparing; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | class ObjectsEqualsStaticMethodUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsWithSameNames_whenObjectsEquals_thenTrue() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals joeAgain = new PersonWithEquals("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(Objects.equals(joe, joeAgain)).isTrue(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsWithDifferentNames_whenObjectsEquals_thenFalse() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals natalie = new PersonWithEquals("Natalie", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(Objects.equals(joe, natalie)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoPersonWithEqualsFirstNull_whenObjectsEquals_thenFalse() { | ||||||
|  |         PersonWithEquals nobody = null; | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  | 
 | ||||||
|  |         assertThat(Objects.equals(nobody, joe)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoObjectsSecondtNull_whenObjectsEquals_thenFalse() { | ||||||
|  |         PersonWithEquals joe = new PersonWithEquals("Joe", "Portman"); | ||||||
|  |         PersonWithEquals nobody = null; | ||||||
|  | 
 | ||||||
|  |         assertThat(Objects.equals(joe, nobody)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void givenTwoObjectsNull_whenObjectsEquals_thenTrue() { | ||||||
|  |         PersonWithEquals nobody = null; | ||||||
|  |         PersonWithEquals nobodyAgain = null; | ||||||
|  | 
 | ||||||
|  |         assertThat(Objects.equals(nobody, nobodyAgain)).isTrue(); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user