This is an automated email from the ASF dual-hosted git repository. kinow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-collections.git
commit d0551d01b3d7e97aa5d8fb1ec91e648a93dab929 Author: dota17 <chenguopingd...@163.com> AuthorDate: Tue Oct 22 09:55:26 2019 +0800 [COLLECTIONS-708] Add hashcode method to CollectionUtils that supports an equator parameter --- .../commons/collections4/CollectionUtils.java | 26 ++++++++++++ .../commons/collections4/CollectionUtilsTest.java | 49 +++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/collections4/CollectionUtils.java b/src/main/java/org/apache/commons/collections4/CollectionUtils.java index 2b73511..7f7d6bc 100644 --- a/src/main/java/org/apache/commons/collections4/CollectionUtils.java +++ b/src/main/java/org/apache/commons/collections4/CollectionUtils.java @@ -644,6 +644,32 @@ public class CollectionUtils { } /** + * Returns the hash code the the input collection using the hash method of the equator. + * <p> + * If the input collection is null return 0. + * </p> + * + * @param <E> the element type + * @param collection the input collection + * @param equator the equator used for generate hashCode + * @return the hashCode of Collection through the hash method of Equator + * @throws NullPointerException if the equator is null + * @since 4.5 + */ + public static <E> int hashCode(final Collection<? extends E> collection, + final Equator<? super E> equator) { + Objects.requireNonNull(equator, "equator"); + if (null == collection) { + return 0; + } + int hashCode = 1; + for (final E e : collection) { + hashCode = 31 * hashCode + equator.hash(e); + } + return hashCode; + } + + /** * Wraps another object and uses the provided Equator to implement * {@link #equals(Object)} and {@link #hashCode()}. * <p> diff --git a/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java b/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java index 7d1bd98..4922a91 100644 --- a/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java +++ b/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.SortedMap; @@ -741,6 +742,52 @@ public class CollectionUtilsTest extends MockTestCase { CollectionUtils.isEqualCollection(collectionA, collectionA, null); } + @Test + public void testHashCode() { + final Equator<Integer> e = new Equator<Integer>() { + @Override + public boolean equate(final Integer o1, final Integer o2) { + if (o1 % 2 == 0 ^ o2 % 2 == 0) { + return false; + } + return true; + } + + @Override + public int hash(final Integer o) { + return o == null ? 0 : Objects.hashCode(o); + } + }; + + assertEquals(collectionA.hashCode(), CollectionUtils.hashCode(collectionA, e)); + } + + @Test + public void testHashCodeNullCollection() { + final Equator<Integer> e = new Equator<Integer>() { + @Override + public boolean equate(final Integer o1, final Integer o2) { + if (o1 % 2 == 0 ^ o2 % 2 == 0) { + return false; + } + return true; + } + + @Override + public int hash(final Integer o) { + return o == null ? 0 : Objects.hashCode(o); + } + }; + + final Collection<Integer> collection = null; + assertEquals(0, CollectionUtils.hashCode(collection, e)); + } + + @Test(expected=NullPointerException.class) + public void testHashCodeNullEquator() { + CollectionUtils.hashCode(collectionB, null); + } + @Test(expected = NullPointerException.class) public void testIsEqualCollectionNullColl1() { final Collection<Integer> list = new ArrayList<>(1); @@ -1073,7 +1120,7 @@ public class CollectionUtilsTest extends MockTestCase { CollectionUtils.get(array, 2); } - @Test(expected=IllegalArgumentException.class) + @Test(expected = IllegalArgumentException.class) public void getFromObject() throws Exception { // Invalid object final Object obj = new Object();