All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.groupbyinc.common.util.collections4.SetUtils Maven / Gradle / Ivy

There is a newer version: 29
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.collections4;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.apache.commons.collections4.set.ListOrderedSet;
import org.apache.commons.collections4.set.PredicatedSet;
import org.apache.commons.collections4.set.PredicatedSortedSet;
import org.apache.commons.collections4.set.TransformedSet;
import org.apache.commons.collections4.set.TransformedSortedSet;
import org.apache.commons.collections4.set.UnmodifiableSet;
import org.apache.commons.collections4.set.UnmodifiableSortedSet;

/**
 * Provides utility methods and decorators for
 * {@link Set} and {@link SortedSet} instances.
 *
 * @since 2.1
 * @version $Id: SetUtils.java 1543964 2013-11-20 21:53:39Z tn $
 */
public class SetUtils {

    /**
     * Get a typed empty unmodifiable Set.
     * @param  the element type
     * @return an empty Set
     */
    public static  Set emptySet() {
        return Collections.emptySet();
    }

    /**
     * An empty unmodifiable sorted set.
     * This is not provided in the JDK.
     */
    @SuppressWarnings("rawtypes")
    public static final SortedSet EMPTY_SORTED_SET =
            UnmodifiableSortedSet.unmodifiableSortedSet(new TreeSet());

    /**
     * Get a typed empty unmodifiable sorted set.
     * @param  the element type
     * @return an empty sorted Set
     */
    @SuppressWarnings("unchecked") // empty set is OK for any type
    public static  SortedSet emptySortedSet() {
        return (SortedSet) EMPTY_SORTED_SET;
    }

    /**
     * SetUtils should not normally be instantiated.
     */
    private SetUtils() {}

    //-----------------------------------------------------------------------

    /**
     * Returns an immutable empty set if the argument is null,
     * or the argument itself otherwise.
     *
     * @param  the element type
     * @param set the set, possibly null
     * @return an empty set if the argument is null
     */
    public static  Set emptyIfNull(final Set set) {
        return set == null ? Collections.emptySet() : set;
    }

    /**
     * Tests two sets for equality as per the equals() contract
     * in {@link java.util.Set#equals(java.lang.Object)}.
     * 

* This method is useful for implementing Set when you cannot * extend AbstractSet. The method takes Collection instances to enable other * collection types to use the Set implementation algorithm. *

* The relevant text (slightly paraphrased as this is a static method) is: *

*

Two sets are considered equal if they have * the same size, and every member of the first set is contained in * the second. This ensures that the equals method works * properly across different implementations of the Set * interface.

* *

* This implementation first checks if the two sets are the same object: * if so it returns true. Then, it checks if the two sets are * identical in size; if not, it returns false. If so, it returns * a.containsAll((Collection) b).

*
* * @see java.util.Set * @param set1 the first set, may be null * @param set2 the second set, may be null * @return whether the sets are equal by value comparison */ public static boolean isEqualSet(final Collection set1, final Collection set2) { if (set1 == set2) { return true; } if (set1 == null || set2 == null || set1.size() != set2.size()) { return false; } return set1.containsAll(set2); } /** * Generates a hash code using the algorithm specified in * {@link java.util.Set#hashCode()}. *

* This method is useful for implementing Set when you cannot * extend AbstractSet. The method takes Collection instances to enable other * collection types to use the Set implementation algorithm. * * @param the element type * @see java.util.Set#hashCode() * @param set the set to calculate the hash code for, may be null * @return the hash code */ public static int hashCodeForSet(final Collection set) { if (set == null) { return 0; } int hashCode = 0; for (final T obj : set) { if (obj != null) { hashCode += obj.hashCode(); } } return hashCode; } //----------------------------------------------------------------------- /** * Returns a synchronized set backed by the given set. *

* You must manually synchronize on the returned set's iterator to * avoid non-deterministic behavior: * *

     * Set s = SetUtils.synchronizedSet(mySet);
     * synchronized (s) {
     *     Iterator i = s.iterator();
     *     while (i.hasNext()) {
     *         process (i.next());
     *     }
     * }
     * 
* * This method is just a wrapper for {@link Collections#synchronizedSet(Set)}. * * @param the element type * @param set the set to synchronize, must not be null * @return a synchronized set backed by the given set * @throws IllegalArgumentException if the set is null */ public static Set synchronizedSet(final Set set) { return Collections.synchronizedSet(set); } /** * Returns an unmodifiable set backed by the given set. *

* This method uses the implementation in the decorators subpackage. * * @param the element type * @param set the set to make unmodifiable, must not be null * @return an unmodifiable set backed by the given set * @throws IllegalArgumentException if the set is null */ public static Set unmodifiableSet(final Set set) { return UnmodifiableSet.unmodifiableSet(set); } /** * Returns a predicated (validating) set backed by the given set. *

* Only objects that pass the test in the given predicate can be added to the set. * Trying to add an invalid object results in an IllegalArgumentException. * It is important not to use the original set after invoking this method, * as it is a backdoor for adding invalid objects. * * @param the element type * @param set the set to predicate, must not be null * @param predicate the predicate for the set, must not be null * @return a predicated set backed by the given set * @throws IllegalArgumentException if the Set or Predicate is null */ public static Set predicatedSet(final Set set, final Predicate predicate) { return PredicatedSet.predicatedSet(set, predicate); } /** * Returns a transformed set backed by the given set. *

* Each object is passed through the transformer as it is added to the * Set. It is important not to use the original set after invoking this * method, as it is a backdoor for adding untransformed objects. *

* Existing entries in the specified set will not be transformed. * If you want that behaviour, see {@link TransformedSet#transformedSet}. * * @param the element type * @param set the set to transform, must not be null * @param transformer the transformer for the set, must not be null * @return a transformed set backed by the given set * @throws IllegalArgumentException if the Set or Transformer is null */ public static Set transformedSet(final Set set, final Transformer transformer) { return TransformedSet.transformingSet(set, transformer); } /** * Returns a set that maintains the order of elements that are added * backed by the given set. *

* If an element is added twice, the order is determined by the first add. * The order is observed through the iterator or toArray. * * @param the element type * @param set the set to order, must not be null * @return an ordered set backed by the given set * @throws IllegalArgumentException if the Set is null */ public static Set orderedSet(final Set set) { return ListOrderedSet.listOrderedSet(set); } //----------------------------------------------------------------------- /** * Returns a synchronized sorted set backed by the given sorted set. *

* You must manually synchronize on the returned set's iterator to * avoid non-deterministic behavior: * *

     * Set s = SetUtils.synchronizedSet(mySet);
     * synchronized (s) {
     *     Iterator i = s.iterator();
     *     while (i.hasNext()) {
     *         process (i.next());
     *     }
     * }
     * 
* * This method is just a wrapper for {@link Collections#synchronizedSortedSet(SortedSet)}. * * @param the element type * @param set the sorted set to synchronize, must not be null * @return a synchronized set backed by the given set * @throws IllegalArgumentException if the set is null */ public static SortedSet synchronizedSortedSet(final SortedSet set) { return Collections.synchronizedSortedSet(set); } /** * Returns an unmodifiable sorted set backed by the given sorted set. *

* This method uses the implementation in the decorators subpackage. * * @param the element type * @param set the sorted set to make unmodifiable, must not be null * @return an unmodifiable set backed by the given set * @throws IllegalArgumentException if the set is null */ public static SortedSet unmodifiableSortedSet(final SortedSet set) { return UnmodifiableSortedSet.unmodifiableSortedSet(set); } /** * Returns a predicated (validating) sorted set backed by the given sorted set. *

* Only objects that pass the test in the given predicate can be added to the set. * Trying to add an invalid object results in an IllegalArgumentException. * It is important not to use the original set after invoking this method, * as it is a backdoor for adding invalid objects. * * @param the element type * @param set the sorted set to predicate, must not be null * @param predicate the predicate for the sorted set, must not be null * @return a predicated sorted set backed by the given sorted set * @throws IllegalArgumentException if the Set or Predicate is null */ public static SortedSet predicatedSortedSet(final SortedSet set, final Predicate predicate) { return PredicatedSortedSet.predicatedSortedSet(set, predicate); } /** * Returns a transformed sorted set backed by the given set. *

* Each object is passed through the transformer as it is added to the * Set. It is important not to use the original set after invoking this * method, as it is a backdoor for adding untransformed objects. *

* Existing entries in the specified set will not be transformed. * If you want that behaviour, see {@link TransformedSortedSet#transformedSortedSet}. * * @param the element type * @param set the set to transform, must not be null * @param transformer the transformer for the set, must not be null * @return a transformed set backed by the given set * @throws IllegalArgumentException if the Set or Transformer is null */ public static SortedSet transformedSortedSet(final SortedSet set, final Transformer transformer) { return TransformedSortedSet.transformingSortedSet(set, transformer); } }