import java.util.Set;
import java.util.Map;
import java.util.List;
import java.util.Queue;
import java.util.HashSet;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.LinkedHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public
class
GenericUtils {
public
static
<K, V> Map<K, V> getMap() {
return
new
HashMap<K, V>();
}
public
static
<K, V> Map<K, V> getMap(int initialCapacity) {
return
new
HashMap<K, V>(initialCapacity);
}
public
static
<K, V> Map<K, V> getConcurrentMap() {
return
new
ConcurrentHashMap<K, V>();
}
public
static
<K, V> Map<K, V> getConcurrentMap(int initialCapacity) {
return
new
ConcurrentHashMap<K, V>(initialCapacity);
}
public
static
<K, V> Map<K, V> getLinkedMap() {
return
new
LinkedHashMap<K, V>();
}
public
static
<K, V> Map<K, V> getLinkedMap(int initialCapacity) {
return
new
LinkedHashMap<K, V>(initialCapacity);
}
public
static
<K, V> Map<K, V> getTreeMap() {
return
new
TreeMap<K, V>();
}
public
static
<K, V> ConcurrentMap<K, V> getConcurrentHashMap() {
return
new
ConcurrentHashMap<K, V>();
}
public
static
<K, V> ConcurrentMap<K, V> getConcurrentHashMap(int initialCapacity) {
return
new
ConcurrentHashMap<K, V>(initialCapacity);
}
public
static
<T> List<T> getList() {
return
new
ArrayList<T>();
}
public
static
<T> List<T> getList(int initialCapacity) {
return
new
ArrayList<T>(initialCapacity);
}
public
static
<T> List<T> getList(Collection<?
extends
T> c) {
if
(ObjectUtils.isNotEmpty(c))
return
new
ArrayList<T>(c);
return
new
ArrayList<T>();
}
public
static
<T> List<T> getLinkedList() {
return
new
LinkedList<T>();
}
public
static
<T> Set<T> getHashSet() {
return
new
HashSet<T>();
}
public
static
<T> Set<T> getHashSet(int initialCapacity) {
return
new
HashSet<T>(initialCapacity);
}
public
static
<T> Set<T> getHashSet(Collection<?
extends
T> c) {
if
(ObjectUtils.isEmpty(c))
return
new
HashSet<T>();
return
new
HashSet<T>(c);
}
public
static
<T> Set<T> getTreeSet() {
return
new
TreeSet<T>();
}
public
static
<T> Set<T> getTreeSet(Collection<?
extends
T> c) {
if
(ObjectUtils.isEmpty(c))
return
new
TreeSet<T>();
return
new
TreeSet<T>(c);
}
public
static
<E> Queue<E> getQueue() {
return
new
LinkedList<E>();
}
public
static
<T> Set<T> unionHashSet(Set<T> setA, Set<T> setB) {
boolean isEmptySetA = ObjectUtils.isEmpty(setA);
boolean isEmptySetB = ObjectUtils.isEmpty(setB);
if
(isEmptySetA && isEmptySetB)
return
getHashSet();
if
(isEmptySetA && !isEmptySetB)
return
setB;
if
(!isEmptySetA && isEmptySetB)
return
setA;
Set<T> result = getHashSet(setA);
result.addAll(setB);
return
result;
}
public
static
<T> Set<T> intersectHashSet(Set<T> setA, Set<T> setB) {
if
(ObjectUtils.isEmpty(setA) || ObjectUtils.isEmpty(setB))
return
null;
Set<T> result = getHashSet(setA);
result.retainAll(setB);
return
result;
}
public
static
<T> Set<T> differenceHashSet(Set<T> setA, Set<T> setB) {
if
(ObjectUtils.isEmpty(setA))
return
null;
if
(ObjectUtils.isEmpty(setB))
return
setA;
Set<T> result = getHashSet(setA);
result.removeAll(setB);
return
result;
}
public
static
<T> Set<T> complementHashSet(Set<T> setA, Set<T> setB) {
return
differenceHashSet(unionHashSet(setA, setB), intersectHashSet(setA, setB));
}
}