Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.groupbyinc.common.apache.commons.collections4.SetUtils Maven / Gradle / Ivy
/*
* 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 extends E> 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 super E> 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 super E, ? extends E> 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 super E> 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 super E, ? extends E> transformer) {
return TransformedSortedSet.transformingSortedSet(set, transformer);
}
}