public class CollKit extends Object
| Modifier and Type | Class and Description |
|---|---|
static interface |
CollKit.Consumer<T>
针对一个参数做相应的操作
|
static interface |
CollKit.Hash<T>
Hash计算接口
|
static interface |
CollKit.KVConsumer<K,V>
针对两个参数做相应的操作,例如Map中的KEY和VALUE
|
| Constructor and Description |
|---|
CollKit() |
| Modifier and Type | Method and Description |
|---|---|
static <T> Collection<T> |
addAll(Collection<T> collection,
Enumeration<T> enumeration)
加入全部
|
static <T> Collection<T> |
addAll(Collection<T> collection,
Iterable<T> iterable)
加入全部
|
static <T> Collection<T> |
addAll(Collection<T> collection,
Iterator<T> iterator)
加入全部
|
static <T> Collection<T> |
addAll(Collection<T> collection,
Object value)
将指定对象全部加入到集合中
提供的对象如果为集合类型,会自动转换为目标元素类型
|
static <T> Collection<T> |
addAll(Collection<T> collection,
Object value,
Type elementType)
将指定对象全部加入到集合中
提供的对象如果为集合类型,会自动转换为目标元素类型
|
static <T> Collection<T> |
addAll(Collection<T> collection,
T[] values)
加入全部
|
static List<String> |
addAll(List<String> list,
String part,
boolean isTrim,
boolean ignoreEmpty)
将字符串加入List中
|
static <T> List<T> |
addAllIfNotContains(List<T> list,
List<T> otherList)
将另一个列表中的元素加入到列表中,如果列表中已经存在此元素则忽略之
|
static <E> Enumeration<E> |
asEnumeration(Iterator<E> iter)
Iterator转换为Enumeration
|
static <E> Iterable<E> |
asIterable(Iterator<E> iter)
|
static <E> Iterator<E> |
asIterator(Enumeration<E> e)
Enumeration转换为Iterator
|
static void |
clear(Collection<?>... collections)
清除一个或多个集合内的元素,每个集合调用clear()方法
|
static <T> T[] |
concat(T[] one,
T[] other,
Class<T> clazz)
Concatenates 2 arrays
|
static boolean |
contains(Collection<?> collection,
Object value)
判断指定集合是否包含指定值,如果集合为空(null或者空),返回
false,否则找到元素返回true |
static boolean |
contains(Enumeration<?> enumeration,
Object element)
检查给定枚举是否包含给定元素.
|
static boolean |
contains(Iterator<?> iterator,
Object element)
检查给定的迭代器是否包含给定的元素.
|
static <T> boolean |
contains(T[] array,
T element)
检查给定数组是否包含给定元素
|
static boolean |
containsAll(Collection<?> coll1,
Collection<?> coll2)
集合1中是否包含集合2中所有的元素,即集合2是否为集合1的子集
|
static boolean |
containsAny(Collection<?> coll1,
Collection<?> coll2)
其中一个集合在另一个集合中是否至少包含一个元素,既是两个集合是否至少有一个共同的元素
|
static <T> int |
count(Iterable<T> iterable,
Matcher<T> matcher)
集合中匹配规则的数量
|
static <T> Map<T,Integer> |
countMap(Iterable<T> collection)
根据集合返回一个元素计数的
Map
所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
例如:[a,b,c,c,c] 得到:
a: 1
b: 1
c: 3 |
static <T> Collection<T> |
create(Class<?> collectionType)
创建新的集合对象
|
static <K,V> Map<K,V> |
createMap(Class<?> mapType)
|
static <T> Collection<T> |
disjunction(Collection<T> coll1,
Collection<T> coll2)
两个集合的差集
针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留两个集合中此元素个数差的个数
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[c],此结果中只保留了一个
任意一个集合为空,返回另一个集合
两个集合无交集则返回两个集合的组合
|
static <T> ArrayList<T> |
distinct(Collection<T> collection)
去重集合
|
static List<Object> |
extract(Iterable<?> collection,
Editor<Object> editor)
通过Editor抽取集合元素中的某些值返回为新列表
例如提供的是一个Bean列表,通过Editor接口实现获取某个字段值,返回这个字段值组成的新列表
|
static List<Object> |
extract(Iterable<?> collection,
Editor<Object> editor,
boolean ignoreNull)
通过Editor抽取集合元素中的某些值返回为新列表
例如提供的是一个Bean列表,通过Editor接口实现获取某个字段值,返回这个字段值组成的新列表
|
static <T> Collection<T> |
filter(Collection<T> collection,
Editor<T> editor)
过滤
过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
static <E> Iterator<E> |
filter(Iterator<E> iter,
Filter<E> filter)
过滤集合,此方法在原集合上直接修改
通过实现Filter接口,完成元素的过滤,这个Filter实现可以实现以下功能:
|
static <T> List<T> |
filter(List<T> list,
Editor<T> editor)
过滤
过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
static <K,V> Map<K,V> |
filter(Map<K,V> map,
Editor<Map.Entry<K,V>> editor)
过滤
过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
static <K,V> Map<K,V> |
filter(Map<K,V> map,
Filter<Map.Entry<K,V>> filter)
过滤
过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
static <T extends Iterable<E>,E> |
filter(T iter,
Filter<E> filter)
过滤集合,此方法在原集合上直接修改
通过实现Filter接口,完成元素的过滤,这个Filter实现可以实现以下功能:
|
static <T> T |
findOne(Iterable<T> collection,
Filter<T> filter)
查找第一个匹配元素对象
|
static <T> T |
findOneByField(Iterable<T> collection,
String fieldName,
Object fieldValue)
查找第一个匹配元素对象
如果集合元素是Map,则比对键和值是否相同,相同则返回
如果为普通Bean,则通过反射比对元素字段名对应的字段值是否相同,相同则返回
如果给定字段值参数是
null 且元素对象中的字段值也为null则认为相同 |
static <T> Optional<T> |
firstNotNullElem(Collection<T> list)
找到第一个不为 null 的元素
|
static Object |
forceGetFieldValue(Object obj,
String fieldName)
获取指定对象的指定属性值(去除private,protected的限制)
|
static <T> void |
forEach(Enumeration<T> enumeration,
CollKit.Consumer<T> consumer)
循环遍历
Enumeration,使用CollKit.Consumer 接受遍历的每条数据,并针对每条数据做处理 |
static <T> void |
forEach(Iterator<T> iterator,
CollKit.Consumer<T> consumer)
循环遍历
Iterator,使用CollKit.Consumer 接受遍历的每条数据,并针对每条数据做处理 |
static <K,V> void |
forEach(Map<K,V> map,
CollKit.KVConsumer<K,V> kvConsumer)
循环遍历Map,使用
CollKit.KVConsumer 接受遍历的每条数据,并针对每条数据做处理 |
static <T> T |
get(Collection<T> collection,
int index)
获取集合中指定下标的元素值,下标可以为负数,例如-1表示最后一个元素
如果元素越界,返回null
|
static <T> List<T> |
getAny(Collection<T> collection,
int... indexes)
获取集合中指定多个下标的元素值,下标可以为负数,例如-1表示最后一个元素
|
static Class<?> |
getElementType(Iterable<?> iterable)
获得
Iterable对象的元素类型(通过第一个非空元素判断) |
static Class<?> |
getElementType(Iterator<?> iterator)
获得
Iterator对象的元素类型(通过第一个非空元素判断) |
static List<Object> |
getFieldValues(Iterable<?> collection,
String fieldName)
获取给定Bean列表中指定字段名对应字段值的列表
列表元素支持Bean与Map
|
static <T> T |
getFirst(Iterable<T> iterable)
获取集合的第一个元素
|
static <T> T |
getFirst(Iterator<T> iterator)
获取集合的第一个元素
|
static <T> T |
getLast(Collection<T> collection)
获取集合的最后一个元素
|
static <T> List<List<T>> |
group(Collection<T> collection,
CollKit.Hash<T> hash)
分组,按照
CollKit.Hash接口定义的hash算法,集合中的元素放入hash值对应的子列表中 |
static <T> List<List<T>> |
groupByField(Collection<T> collection,
String fieldName)
根据元素的指定字段名分组,非Bean都放在第一个分组中
|
static boolean |
hasNull(Iterable<?> iterable)
是否包含
null元素 |
static <T> int[] |
indexOfAll(Collection<T> collection,
Matcher<T> matcher)
获取匹配规则定义中匹配到元素的所有位置
此方法对于某些无序集合的位置信息,以转换为数组后的位置为准
|
static <T> Collection<T> |
intersection(Collection<T> coll1,
Collection<T> coll2)
两个集合的交集
针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最少的个数
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c, c],此结果中只保留了两个c
|
static <T> Collection<T> |
intersection(Collection<T> coll1,
Collection<T> coll2,
Collection<T>... otherColls)
多个集合的交集
针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最少的个数
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c, c],此结果中只保留了两个c
|
static <T> Set<T> |
intersectOne(Collection<T> coll1,
Collection<T> coll2,
Collection<T>... otherColls)
多个集合的交集
针对一个集合中存在多个相同元素的情况,只保留一个
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c],此结果中只保留了一个c
|
static boolean |
isEmpty(Collection<?> collection)
集合是否为空
|
static boolean |
isEmpty(Enumeration<?> enumeration)
Enumeration是否为空
|
static boolean |
isEmpty(Iterable<?> iterable)
Iterable是否为空
|
static boolean |
isEmpty(Iterator<?> Iterator)
Iterator是否为空
|
static boolean |
isEmpty(Map<?,?> map)
Map是否为空
|
static boolean |
isNotEmpty(Collection<?> collection)
集合是否为非空
|
static boolean |
isNotEmpty(Enumeration<?> enumeration)
Enumeration是否为空
|
static boolean |
isNotEmpty(Iterable<?> iterable)
Iterable是否为空
|
static boolean |
isNotEmpty(Iterator<?> Iterator)
Iterator是否为空
|
static boolean |
isNotEmpty(Map<?,?> map)
Map是否为非空
|
static <T> String |
join(Iterable<T> iterable,
CharSequence conjunction)
|
static <T> String |
join(Iterable<T> iterable,
CharSequence conjunction,
String prefix,
String suffix)
以 conjunction 为分隔符将集合转换为字符串
|
static <T> String |
join(Iterator<T> iterator,
CharSequence conjunction)
|
static <K> Set<K> |
keySet(Collection<Map<K,?>> mapCollection)
获取指定Map列表中所有的Key
|
static <T> List<T> |
list(boolean isLinked)
新建一个空List
|
static <T> List<T> |
list(boolean isLinked,
Collection<T> collection)
新建一个List
|
static <T> List<T> |
list(boolean isLinked,
Enumeration<T> enumration)
新建一个List
提供的参数为null时返回空
ArrayList |
static <T> List<T> |
list(boolean isLinked,
Iterable<T> iterable)
新建一个List
提供的参数为null时返回空
ArrayList |
static <T> List<T> |
list(boolean isLinked,
Iterator<T> iter)
新建一个ArrayList
提供的参数为null时返回空
ArrayList |
static <T> List<T> |
list(boolean isLinked,
T... values)
新建一个List
|
static <T,R> List<R> |
map(Iterable<T> collection,
Function<T,R> func,
boolean ignoreNull)
通过func自定义一个规则,此规则将原集合中的元素转换成新的元素,生成新的列表返回
例如提供的是一个Bean列表,通过Function接口实现获取某个字段值,返回这个字段值组成的新列表
|
static <T extends Comparable<? super T>> |
max(Collection<T> coll)
取最大值
|
static <T extends Comparable<? super T>> |
min(Collection<T> coll)
取最大值
|
static <T> ArrayList<T> |
newArrayList(Collection<T> collection)
新建一个ArrayList
|
static <T> ArrayList<T> |
newArrayList(Enumeration<T> enumration)
新建一个ArrayList
提供的参数为null时返回空
ArrayList |
static <T> ArrayList<T> |
newArrayList(Iterable<T> iterable)
新建一个ArrayList
提供的参数为null时返回空
ArrayList |
static <T> ArrayList<T> |
newArrayList(Iterator<T> iter)
新建一个ArrayList
提供的参数为null时返回空
ArrayList |
static <T> ArrayList<T> |
newArrayList(T... values)
新建一个ArrayList
|
static <T> BlockingQueue<T> |
newBlockingQueue(int capacity,
boolean isLinked)
新建
BlockingQueue
在队列为空时,获取元素的线程会等待队列变为非空 当队列满时,存储元素的线程会等待队列可用 |
static <T> CopyOnWriteArrayList<T> |
newCopyOnWriteArrayList(Collection<T> collection)
新建一个CopyOnWriteArrayList
|
static <K,V> HashMap<K,V> |
newHashMap()
新建一个HashMap
|
static <K,V> HashMap<K,V> |
newHashMap(int size)
新建一个HashMap
|
static <K,V> HashMap<K,V> |
newHashMap(int size,
boolean isOrder)
新建一个HashMap
|
static <T> HashSet<T> |
newHashSet(boolean isSorted,
Collection<T> collection)
新建一个HashSet
|
static <T> HashSet<T> |
newHashSet(boolean isSorted,
Enumeration<T> enumration)
新建一个HashSet
|
static <T> HashSet<T> |
newHashSet(boolean isSorted,
Iterator<T> iter)
新建一个HashSet
|
static <T> HashSet<T> |
newHashSet(boolean isSorted,
T... ts)
新建一个HashSet
|
static <T> HashSet<T> |
newHashSet(Collection<T> collection)
新建一个HashSet
|
static <T> HashSet<T> |
newHashSet(T... ts)
新建一个HashSet
|
static <T> LinkedHashSet<T> |
newLinkedHashSet(T... ts)
新建一个LinkedHashSet
|
static <T> LinkedList<T> |
newLinkedList(T... values)
新建LinkedList
|
static <E> List<E> |
ofImmutableList(E... es)
不可变 List
|
static <E> Set<E> |
ofImmutableSet(E... es)
不可变 Set
|
static <T> List<T> |
page(int pageNo,
int pageSize,
List<T> list)
对指定List分页取值
|
static <T> List<T> |
popPart(Deque<T> surplusAlaDatas,
int partSize)
切取部分数据
切取后的栈将减少这些元素
|
static <T> List<T> |
popPart(Stack<T> surplusAlaDatas,
int partSize)
切取部分数据
切取后的栈将减少这些元素
|
static int[] |
rainbow(int currentPage,
int pageCount)
分页彩虹算法(默认展示10页)
|
static int[] |
rainbow(int currentPage,
int pageCount,
int displayCount)
分页彩虹算法
通过传入的信息,生成一个分页列表显示
|
static <T> Collection<T> |
removeAny(Collection<T> collection,
T... elesRemoved)
去掉集合中的多个元素
|
static <T extends CharSequence> |
removeBlank(Collection<T> collection)
去除
null或者""或者空白字符串 元素 |
static <T extends CharSequence> |
removeEmpty(Collection<T> collection)
去除
null或者"" 元素 |
static <T> Collection<T> |
removeNull(Collection<T> collection)
去除
null 元素 |
static <T> List<T> |
reverse(List<T> list)
反序给定List,会在原List基础上直接修改
|
static <T> List<T> |
reverse(List<T> list,
boolean clone)
反序给定List,会创建一个新的List,原List数据不变
|
static <T> List<T> |
setOrAppend(List<T> list,
int index,
T element)
设置或增加元素 当index小于List的长度时,替换指定位置的值,否则在尾部追加
|
static <T> List<T> |
sort(Collection<T> collection,
Comparator<? super T> comparator)
排序集合,排序不会修改原集合
|
static <E> void |
sort(List<E> list,
boolean asc,
String... name)
对list的元素按照多个属性名称排序,
list元素的属性可以是数字(byte、short、int、long、float、double等,支持正数、负数、0)、char、String、java.util.Date
|
static <E> void |
sort(List<E> list,
String[] name,
boolean[] type)
给list的每个属性都指定是升序还是降序
|
static <T> List<T> |
sort(List<T> list,
Comparator<? super T> c)
针对List排序,排序会修改原List
|
static <K,V> TreeMap<K,V> |
sort(Map<K,V> map,
Comparator<? super K> comparator)
排序Map
|
static <K,V> LinkedHashMap<K,V> |
sortByEntry(Map<K,V> map,
Comparator<Map.Entry<K,V>> comparator)
通过Entry排序,可以按照键排序,也可以按照值排序,亦或者两者综合排序
|
static <T> List<T> |
sortByProperty(Collection<T> collection,
String property)
根据Bean的属性排序
|
static <T> List<T> |
sortByProperty(List<T> list,
String property)
根据Bean的属性排序
|
static <K,V> List<Map.Entry<K,V>> |
sortEntryToList(Collection<Map.Entry<K,V>> collection)
将Set排序(根据Entry的值)
|
static <T> List<T> |
sortPageAll(int pageNo,
int pageSize,
Comparator<T> comparator,
Collection<T>... colls)
将多个集合排序并显示不同的段落(分页)
实现分页取局部
|
static <K,V> LinkedHashMap<K,V> |
sortToMap(Collection<Map.Entry<K,V>> entryCollection,
Comparator<Map.Entry<K,V>> comparator)
通过Entry排序,可以按照键排序,也可以按照值排序,亦或者两者综合排序
|
static <T> List<List<T>> |
split(Collection<T> collection,
int size)
对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表
|
static <T> List<T> |
sub(Collection<T> collection,
int start,
int end)
截取集合的部分
|
static <T> List<T> |
sub(Collection<T> list,
int start,
int end,
int step)
截取集合的部分
|
static <T> List<T> |
sub(List<T> list,
int start,
int end)
截取集合的部分
|
static <T> List<T> |
sub(List<T> list,
int start,
int end,
int step)
截取集合的部分
|
static <T> Collection<T> |
subtract(Collection<T> coll1,
Collection<T> coll2)
计算集合的单差集,即只返回【集合1】中有,但是【集合2】中没有的元素,例如:
|
static <T> List<T> |
subtractToList(Collection<T> coll1,
Collection<T> coll2)
计算集合的单差集,即只返回【集合1】中有,但是【集合2】中没有的元素
例如:
|
static <E> Collection<E> |
toCollection(Iterable<E> iterable)
|
static <T> ArrayList<T> |
toList(T... values)
数组转为ArrayList
|
static <K,V> Map<K,List<V>> |
toListMap(Iterable<? extends Map<K,V>> mapList)
行转列,合并相同的键,值合并为列表
将Map列表中相同key的值组成列表做为Map的value
是
toMapList(Map)的逆方法
比如传入数据: |
static <K,V> HashMap<K,V> |
toMap(Iterable<Map.Entry<K,V>> entryIter)
将Entry集合转换为HashMap
|
static HashMap<Object,Object> |
toMap(Object[] array)
将数组转换为Map(HashMap),支持数组元素类型为:
|
static <K,V> List<Map<K,V>> |
toMapList(Map<K,? extends Iterable<V>> listMap)
列转行 将Map中值列表分别按照其位置与key组成新的map
是
toListMap(Iterable)的逆方法
比如传入数据: |
static int |
totalPage(int totalCount,
int pageSize)
根据总数计算总页数
|
static <T> TreeSet<T> |
toTreeSet(Collection<T> collection,
Comparator<T> comparator)
将集合转换为排序后的TreeSet
|
static int[] |
transToStartEnd(int pageNo,
int pageSize)
将页数和每页条目数转换为开始位置和结束位置
此方法用于不包括结束位置的分页方法
例如:
页码:1,每页10 =》 [0, 10]
页码:2,每页10 =》 [10, 20]
|
static <T> Collection<T> |
union(Collection<T> coll1,
Collection<T> coll2)
两个集合的并集
针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c, c, c],此结果中只保留了三个c
|
static <T> Collection<T> |
union(Collection<T> coll1,
Collection<T> coll2,
Collection<T>... otherColls)
多个集合的并集
针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c, c, c],此结果中只保留了三个c
|
static <T> List<T> |
unionAll(Collection<T> coll1,
Collection<T> coll2,
Collection<T>... otherColls)
多个集合的完全并集,类似于SQL中的“UNION ALL”
针对一个集合中存在多个相同元素的情况,保留全部元素
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c, c, c, a, b, c, c]
|
static <T> Set<T> |
unionDistinct(Collection<T> coll1,
Collection<T> coll2,
Collection<T>... otherColls)
多个集合的非重复并集,类似于SQL中的“UNION DISTINCT”
针对一个集合中存在多个相同元素的情况,只保留一个
例如:集合1:[a, b, c, c, c],集合2:[a, b, c, c]
结果:[a, b, c],此结果中只保留了一个c
|
static <V> List<V> |
values(Collection<Map<?,V>> mapCollection)
获取指定Map列表中所有的Value
|
static <K,V> ArrayList<V> |
valuesOfKeys(Map<K,V> map,
Iterable<K> keys)
从Map中获取指定键列表对应的值列表
如果key在map中不存在或key对应值为null,则返回值列表对应位置的值也为null
|
static <K,V> ArrayList<V> |
valuesOfKeys(Map<K,V> map,
Iterator<K> keys)
从Map中获取指定键列表对应的值列表
如果key在map中不存在或key对应值为null,则返回值列表对应位置的值也为null
|
static <K,V> ArrayList<V> |
valuesOfKeys(Map<K,V> map,
K... keys)
从Map中获取指定键列表对应的值列表
如果key在map中不存在或key对应值为null,则返回值列表对应位置的值也为null
|
static <K,V> Map<K,V> |
zip(Collection<K> keys,
Collection<V> values)
映射键值(参考Python的zip()函数)
例如:
keys = [a,b,c,d]
values = [1,2,3,4]
则得到的Map是 {a=1, b=2, c=3, d=4}
如果两个数组长度不同,则只对应最短部分
|
static Map<String,String> |
zip(String keys,
String values,
String delimiter)
映射键值(参考Python的zip()函数),返回Map无序
例如:
keys = a,b,c,d
values = 1,2,3,4
delimiter = , 则得到的Map是 {a=1, b=2, c=3, d=4}
如果两个数组长度不同,则只对应最短部分
|
static Map<String,String> |
zip(String keys,
String values,
String delimiter,
boolean isOrder)
映射键值(参考Python的zip()函数)
例如:
keys = a,b,c,d
values = 1,2,3,4
delimiter = , 则得到的Map是 {a=1, b=2, c=3, d=4}
如果两个数组长度不同,则只对应最短部分
|
public static boolean isEmpty(Collection<?> collection)
collection - 集合public static boolean isEmpty(Map<?,?> map)
map - 集合MapKit.isEmpty(Map)public static boolean isEmpty(Iterable<?> iterable)
iterable - Iterable对象IterKit.isEmpty(Iterable)public static boolean isEmpty(Iterator<?> Iterator)
Iterator - Iterator对象IterKit.isEmpty(Iterator)public static boolean isEmpty(Enumeration<?> enumeration)
enumeration - Enumerationpublic static boolean isNotEmpty(Collection<?> collection)
collection - 集合public static boolean isNotEmpty(Map<?,?> map)
map - 集合MapKit.isNotEmpty(Map)public static boolean isNotEmpty(Iterable<?> iterable)
iterable - Iterable对象IterKit.isNotEmpty(Iterable)public static boolean isNotEmpty(Iterator<?> Iterator)
Iterator - Iterator对象IterKit.isNotEmpty(Iterator)public static boolean isNotEmpty(Enumeration<?> enumeration)
enumeration - Enumerationpublic static boolean hasNull(Iterable<?> iterable)
null元素iterable - 被检查的Iterable对象,如果为null 返回truenull元素IterKit.hasNull(Iterable)public static <T> Collection<T> union(Collection<T> coll1, Collection<T> coll2)
T - 集合元素类型coll1 - 集合1coll2 - 集合2ArrayListpublic static <T> Collection<T> union(Collection<T> coll1, Collection<T> coll2, Collection<T>... otherColls)
T - 集合元素类型coll1 - 集合1coll2 - 集合2otherColls - 其它集合ArrayListpublic static <T> Set<T> unionDistinct(Collection<T> coll1, Collection<T> coll2, Collection<T>... otherColls)
T - 集合元素类型coll1 - 集合1coll2 - 集合2otherColls - 其它集合LinkedHashSetpublic static <T> List<T> unionAll(Collection<T> coll1, Collection<T> coll2, Collection<T>... otherColls)
T - 集合元素类型coll1 - 集合1coll2 - 集合2otherColls - 其它集合ArrayListpublic static <T> Collection<T> intersection(Collection<T> coll1, Collection<T> coll2)
T - 集合元素类型coll1 - 集合1coll2 - 集合2ArrayListpublic static <T> Collection<T> intersection(Collection<T> coll1, Collection<T> coll2, Collection<T>... otherColls)
T - 集合元素类型coll1 - 集合1coll2 - 集合2otherColls - 其它集合ArrayListpublic static <T> Set<T> intersectOne(Collection<T> coll1, Collection<T> coll2, Collection<T>... otherColls)
T - 集合元素类型coll1 - 集合1coll2 - 集合2otherColls - 其它集合LinkedHashSetpublic static <T> Collection<T> subtract(Collection<T> coll1, Collection<T> coll2)
subtract([1,2,3,4],[2,3,4,5]) -》 [1]
T - 元素类型coll1 - 集合1coll2 - 集合2public static <T> List<T> subtractToList(Collection<T> coll1, Collection<T> coll2)
subtractToList([1,2,3,4],[2,3,4,5]) - [1]
T - 元素类型coll1 - 集合1coll2 - 集合2public static <T> Collection<T> disjunction(Collection<T> coll1, Collection<T> coll2)
T - 集合元素类型coll1 - 集合1coll2 - 集合2ArrayListpublic static <T> boolean contains(T[] array,
T element)
T - 通用标签array - 数组要检查的数组element - 要查找的元素false,否则找到元素返回truepublic static boolean contains(Collection<?> collection, Object value)
false,否则找到元素返回truecollection - 集合value - 需要查找的值false,否则找到元素返回truepublic static boolean contains(Iterator<?> iterator, Object element)
iterator - 要检查的迭代器element - 要查找的元素true 如果找到, false 否则返回public static boolean contains(Enumeration<?> enumeration, Object element)
enumeration - 要检查的枚举element - 要查找的元素true 如果找到, false 否则返回public static boolean containsAny(Collection<?> coll1, Collection<?> coll2)
coll1 - 集合1coll2 - 集合2intersection(java.util.Collection<T>, java.util.Collection<T>)public static boolean containsAll(Collection<?> coll1, Collection<?> coll2)
coll1 - 集合1coll2 - 集合2public static <T> Map<T,Integer> countMap(Iterable<T> collection)
Map
所谓元素计数就是假如这个集合中某个元素出现了n次,那将这个元素做为key,n做为value
例如:[a,b,c,c,c] 得到:
a: 1
b: 1
c: 3T - 集合元素类型collection - 集合MapIterKit.countMap(Iterable)public static <T> String join(Iterable<T> iterable, CharSequence conjunction)
T - 集合元素类型iterable - Iterableconjunction - 分隔符IterKit.join(Iterable, CharSequence)public static <T> String join(Iterator<T> iterator, CharSequence conjunction)
T - 集合元素类型iterator - 集合conjunction - 分隔符IterKit.join(Iterator, CharSequence)public static <T> String join(Iterable<T> iterable, CharSequence conjunction, String prefix, String suffix)
T - 集合元素类型iterable - Iterableconjunction - 分隔符prefix - 每个元素添加的前缀,null表示不添加suffix - 每个元素添加的后缀,null表示不添加public static <T> List<T> popPart(Stack<T> surplusAlaDatas, int partSize)
T - 集合元素类型surplusAlaDatas - 原数据partSize - 每部分数据的长度public static <T> List<T> popPart(Deque<T> surplusAlaDatas, int partSize)
T - 集合元素类型surplusAlaDatas - 原数据partSize - 每部分数据的长度public static <K,V> HashMap<K,V> newHashMap()
K - Key类型V - Value类型MapKit.newHashMap()public static <K,V> HashMap<K,V> newHashMap(int size, boolean isOrder)
K - Key类型V - Value类型size - 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75isOrder - Map的Key是否有序,有序返回 LinkedHashMap,否则返回 HashMapMapKit.newHashMap(int, boolean)public static <K,V> HashMap<K,V> newHashMap(int size)
K - Key类型V - Value类型size - 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75public static <T> HashSet<T> newHashSet(T... ts)
T - 集合元素类型ts - 元素数组public static <T> LinkedHashSet<T> newLinkedHashSet(T... ts)
T - 集合元素类型ts - 元素数组public static <T> HashSet<T> newHashSet(boolean isSorted, T... ts)
T - 集合元素类型isSorted - 是否有序,有序返回 LinkedHashSet,否则返回 HashSetts - 元素数组public static <T> HashSet<T> newHashSet(Collection<T> collection)
T - 集合元素类型collection - 集合public static <T> HashSet<T> newHashSet(boolean isSorted, Collection<T> collection)
T - 集合元素类型isSorted - 是否有序,有序返回 LinkedHashSet,否则返回HashSetcollection - 集合,用于初始化Setpublic static <T> HashSet<T> newHashSet(boolean isSorted, Iterator<T> iter)
T - 集合元素类型isSorted - 是否有序,有序返回 LinkedHashSet,否则返回HashSetiter - Iteratorpublic static <T> HashSet<T> newHashSet(boolean isSorted, Enumeration<T> enumration)
T - 集合元素类型isSorted - 是否有序,有序返回 LinkedHashSet,否则返回HashSetenumration - Enumerationpublic static <T> List<T> list(boolean isLinked)
T - 集合元素类型isLinked - 是否新建LinkedListpublic static <T> List<T> list(boolean isLinked, T... values)
T - 集合元素类型isLinked - 是否新建LinkedListvalues - 数组public static <T> List<T> list(boolean isLinked, Collection<T> collection)
T - 集合元素类型isLinked - 是否新建LinkedListcollection - 集合public static <T> List<T> list(boolean isLinked, Iterable<T> iterable)
ArrayListT - 集合元素类型isLinked - 是否新建LinkedListiterable - Iterablepublic static <T> List<T> list(boolean isLinked, Iterator<T> iter)
ArrayListT - 集合元素类型isLinked - 是否新建LinkedListiter - Iteratorpublic static <T> List<T> list(boolean isLinked, Enumeration<T> enumration)
ArrayListT - 集合元素类型isLinked - 是否新建LinkedListenumration - Enumerationpublic static <T> ArrayList<T> newArrayList(T... values)
T - 集合元素类型values - 数组public static <T> ArrayList<T> toList(T... values)
T - 集合元素类型values - 数组public static <T> ArrayList<T> newArrayList(Collection<T> collection)
T - 集合元素类型collection - 集合public static <T> ArrayList<T> newArrayList(Iterable<T> iterable)
ArrayListT - 集合元素类型iterable - Iterablepublic static <T> ArrayList<T> newArrayList(Iterator<T> iter)
ArrayListT - 集合元素类型iter - Iteratorpublic static <T> ArrayList<T> newArrayList(Enumeration<T> enumration)
ArrayListT - 集合元素类型enumration - Enumerationpublic static <T> LinkedList<T> newLinkedList(T... values)
T - 类型values - 数组public static <T> CopyOnWriteArrayList<T> newCopyOnWriteArrayList(Collection<T> collection)
T - 集合元素类型collection - 集合CopyOnWriteArrayListpublic static <T> BlockingQueue<T> newBlockingQueue(int capacity, boolean isLinked)
BlockingQueue
在队列为空时,获取元素的线程会等待队列变为非空 当队列满时,存储元素的线程会等待队列可用T - 对象capacity - 容量isLinked - 是否为链表形式BlockingQueuepublic static <T> Collection<T> create(Class<?> collectionType)
T - 对象collectionType - 集合类型public static <K,V> Map<K,V> createMap(Class<?> mapType)
K - map键类型V - map值类型mapType - map类型Map实例MapKit.createMap(Class)public static <T> ArrayList<T> distinct(Collection<T> collection)
T - 集合元素类型collection - 集合ArrayListpublic static <T> List<T> sub(List<T> list, int start, int end)
T - 集合元素类型list - 被截取的数组start - 开始位置(包含)end - 结束位置(不包含)public static <T> List<T> sub(List<T> list, int start, int end, int step)
T - 集合元素类型list - 被截取的数组start - 开始位置(包含)end - 结束位置(不包含)step - 步进public static <T> List<T> sub(Collection<T> collection, int start, int end)
T - 集合元素类型collection - 被截取的数组start - 开始位置(包含)end - 结束位置(不包含)public static <T> List<T> sub(Collection<T> list, int start, int end, int step)
T - 集合元素类型list - 被截取的数组start - 开始位置(包含)end - 结束位置(不包含)step - 步进public static <T> List<List<T>> split(Collection<T> collection, int size)
T - 集合元素类型collection - 集合size - 每个段的长度public static <T> Collection<T> filter(Collection<T> collection, Editor<T> editor)
1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象
T - 集合元素类型collection - 集合editor - 编辑器接口public static <T> List<T> filter(List<T> list, Editor<T> editor)
1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象
T - 集合元素类型list - 集合editor - 编辑器接口public static <T extends Iterable<E>,E> T filter(T iter, Filter<E> filter)
1、过滤出需要的对象,Filter.accept(Object)方法返回false的对象将被使用Iterator.remove()方法移除
T - 集合类型E - 集合元素类型iter - 集合filter - 过滤器接口public static <E> Iterator<E> filter(Iterator<E> iter, Filter<E> filter)
1、过滤出需要的对象,Filter.accept(Object)方法返回false的对象将被使用Iterator.remove()方法移除
E - 集合元素类型iter - 集合filter - 过滤器接口public static <T> Collection<T> removeNull(Collection<T> collection)
null 元素T - 对象collection - 集合public static <T> Collection<T> removeAny(Collection<T> collection, T... elesRemoved)
T - 对象collection - 集合elesRemoved - 被去掉的元素数组public static <T extends CharSequence> Collection<T> removeEmpty(Collection<T> collection)
null或者"" 元素T - 对象collection - 集合public static <T extends CharSequence> Collection<T> removeBlank(Collection<T> collection)
null或者""或者空白字符串 元素T - 对象collection - 集合public static List<Object> extract(Iterable<?> collection, Editor<Object> editor)
collection - 原集合editor - 编辑器public static List<Object> extract(Iterable<?> collection, Editor<Object> editor, boolean ignoreNull)
collection - 原集合editor - 编辑器ignoreNull - 是否忽略空值map(Iterable, Function, boolean)public static <T,R> List<R> map(Iterable<T> collection, Function<T,R> func, boolean ignoreNull)
T - 输入类型R - 结果类型collection - 原集合func - 编辑函数ignoreNull - 是否忽略空值public static List<Object> getFieldValues(Iterable<?> collection, String fieldName)
collection - Bean集合或Map集合fieldName - 字段名或map的键public static <T> T findOne(Iterable<T> collection, Filter<T> filter)
T - 集合元素类型collection - 集合filter - 过滤器,满足过滤条件的第一个元素将被返回public static <T> T findOneByField(Iterable<T> collection, String fieldName, Object fieldValue)
null 且元素对象中的字段值也为null则认为相同T - 集合元素类型collection - 集合,集合元素可以是Bean或者MapfieldName - 集合元素对象的字段名或map的键fieldValue - 集合元素对象的字段值或map的值public static <K,V> Map<K,V> filter(Map<K,V> map, Editor<Map.Entry<K,V>> editor)
1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象
K - Key类型V - Value类型map - Mapeditor - 编辑器接口MapKit.filter(Map, Editor)public static <K,V> Map<K,V> filter(Map<K,V> map, Filter<Map.Entry<K,V>> filter)
1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象
K - Key类型V - Value类型map - Mapfilter - 编辑器接口MapKit.filter(Map, Filter)public static <T> int count(Iterable<T> iterable, Matcher<T> matcher)
T - 集合元素类型iterable - Iterablematcher - 匹配器,为空则全部匹配public static Map<String,String> zip(String keys, String values, String delimiter, boolean isOrder)
keys - 键列表values - 值列表delimiter - 分隔符isOrder - 是否有序public static Map<String,String> zip(String keys, String values, String delimiter)
keys - 键列表values - 值列表delimiter - 分隔符public static <K,V> Map<K,V> zip(Collection<K> keys, Collection<V> values)
K - 键类型V - 值类型keys - 键列表values - 值列表public static <K,V> HashMap<K,V> toMap(Iterable<Map.Entry<K,V>> entryIter)
K - 键类型V - 值类型entryIter - entry集合IterKit.toMap(Iterable)public static HashMap<Object,Object> toMap(Object[] array)
Map.Entry 长度大于1的数组(取前两个值),如果不满足跳过此元素 Iterable 长度也必须大于1(取前两个值),如果不满足跳过此元素 Iterator 长度也必须大于1(取前两个值),如果不满足跳过此元素
Map<Object, Object> colorMap = toMap(new String[][] {{
{"RED", "#FF0000"},
{"GREEN", "#00FF00"},
{"BLUE", "#0000FF"}});
参考:commons-lang
array - 数组 元素类型为Map.Entry、数组、Iterable、IteratorHashMapMapKit.of(Object[])public static <T> TreeSet<T> toTreeSet(Collection<T> collection, Comparator<T> comparator)
T - 集合元素类型collection - 集合comparator - 比较器public static <E> Enumeration<E> asEnumeration(Iterator<E> iter)
Adapt the specified Iterator to the Enumeration interface.
E - 集合元素类型iter - IteratorEnumerationpublic static <E> Iterator<E> asIterator(Enumeration<E> e)
Adapt the specified Enumeration to the Iterator interface
E - 集合元素类型e - EnumerationIteratorIterKit.asIterator(Enumeration)public static <E> Iterable<E> asIterable(Iterator<E> iter)
E - 元素类型iter - IteratorIterableIterKit.asIterable(Iterator)public static <E> Collection<E> toCollection(Iterable<E> iterable)
E - 集合元素类型iterable - IterableCollection 或者 ArrayListpublic static <K,V> Map<K,List<V>> toListMap(Iterable<? extends Map<K,V>> mapList)
toMapList(Map)的逆方法
比如传入数据:
[
{a: 1, b: 1, c: 1}
{a: 2, b: 2}
{a: 3, b: 3}
{a: 4}
]
结果是:
{
a: [1,2,3,4]
b: [1,2,3,]
c: [1]
}
K - 键类型V - 值类型mapList - Map列表MapKit.toListMap(Iterable)public static <K,V> List<Map<K,V>> toMapList(Map<K,? extends Iterable<V>> listMap)
toListMap(Iterable)的逆方法
比如传入数据:
{
a: [1,2,3,4]
b: [1,2,3,]
c: [1]
}
结果是:
[
{a: 1, b: 1, c: 1}
{a: 2, b: 2}
{a: 3, b: 3}
{a: 4}
]
K - 键类型V - 值类型listMap - 列表MapMapKit.toMapList(Map)public static <T> Collection<T> addAll(Collection<T> collection, Object value)
T - 元素类型collection - 被加入的集合value - 对象,可能为Iterator、Iterable、Enumeration、Arraypublic static <T> Collection<T> addAll(Collection<T> collection, Object value, Type elementType)
T - 元素类型collection - 被加入的集合value - 对象,可能为Iterator、Iterable、Enumeration、Array,或者与集合元素类型一致elementType - 元素类型,为空时,使用Object类型来接纳所有类型public static <T> Collection<T> addAll(Collection<T> collection, Iterator<T> iterator)
T - 集合元素类型collection - 被加入的集合 Collectioniterator - 要加入的Iteratorpublic static <T> Collection<T> addAll(Collection<T> collection, Iterable<T> iterable)
T - 集合元素类型collection - 被加入的集合 Collectioniterable - 要加入的内容Iterablepublic static <T> Collection<T> addAll(Collection<T> collection, Enumeration<T> enumeration)
T - 集合元素类型collection - 被加入的集合 Collectionenumeration - 要加入的内容Enumerationpublic static <T> Collection<T> addAll(Collection<T> collection, T[] values)
T - 集合元素类型collection - 被加入的集合 Collectionvalues - 要加入的内容数组public static List<String> addAll(List<String> list, String part, boolean isTrim, boolean ignoreEmpty)
list - 列表part - 被加入的部分isTrim - 是否去除两端空白符ignoreEmpty - 是否略过空字符串(空字符串不做为一个元素)public static <T> List<T> addAllIfNotContains(List<T> list, List<T> otherList)
T - 集合元素类型list - 列表otherList - 其它列表public static <T> T get(Collection<T> collection, int index)
T - 元素类型collection - 集合index - 下标,支持负数public static <T> List<T> getAny(Collection<T> collection, int... indexes)
T - 元素类型collection - 集合indexes - 下标,支持负数public static <T> T getFirst(Iterable<T> iterable)
T - 集合元素类型iterable - IterableIterKit.getFirst(Iterable)public static <T> T getFirst(Iterator<T> iterator)
T - 集合元素类型iterator - IteratorIterKit.getFirst(Iterator)public static <T> T getLast(Collection<T> collection)
T - 集合元素类型collection - Collectionpublic static Class<?> getElementType(Iterable<?> iterable)
Iterable对象的元素类型(通过第一个非空元素判断)iterable - IterableIterKit.getElementType(Iterable)public static Class<?> getElementType(Iterator<?> iterator)
Iterator对象的元素类型(通过第一个非空元素判断)iterator - IteratorIterKit.getElementType(Iterator)public static <K,V> ArrayList<V> valuesOfKeys(Map<K,V> map, K... keys)
K - 键类型V - 值类型map - Mapkeys - 键列表public static <K,V> ArrayList<V> valuesOfKeys(Map<K,V> map, Iterable<K> keys)
K - 键类型V - 值类型map - Mapkeys - 键列表public static <K,V> ArrayList<V> valuesOfKeys(Map<K,V> map, Iterator<K> keys)
K - 键类型V - 值类型map - Mapkeys - 键列表public static <T> List<T> page(int pageNo, int pageSize, List<T> list)
T - 集合元素类型pageNo - 页码,从1开始计数,0和1效果相同pageSize - 每页的条目数list - 列表public static <T> List<T> sort(Collection<T> collection, Comparator<? super T> comparator)
T - 集合元素类型collection - 集合comparator - 比较器public static <T> List<T> sort(List<T> list, Comparator<? super T> c)
T - 元素类型list - 被排序的Listc - ComparatorCollections.sort(List, Comparator)public static <K,V> TreeMap<K,V> sort(Map<K,V> map, Comparator<? super K> comparator)
K - 键类型V - 值类型map - Mapcomparator - Entry比较器TreeMappublic static <E> void sort(List<E> list, boolean asc, String... name)
E - 对象list - 集合name - list元素的属性名称asc - true升序,false降序public static <E> void sort(List<E> list, String[] name, boolean[] type)
E - 对象list - 集合name - 参数数组type - 每个属性对应的升降序数组, true升序,false降序public static <T> List<T> sortPageAll(int pageNo, int pageSize, Comparator<T> comparator, Collection<T>... colls)
T - 集合元素类型pageNo - 页码,从1开始计数,0和1效果相同pageSize - 每页的条目数comparator - 比较器colls - 集合数组public static <T> List<T> sortByProperty(Collection<T> collection, String property)
T - 元素类型collection - 集合,会被转换为Listproperty - 属性名public static <T> List<T> sortByProperty(List<T> list, String property)
T - 元素类型list - Listproperty - 属性名public static <K,V> LinkedHashMap<K,V> sortToMap(Collection<Map.Entry<K,V>> entryCollection, Comparator<Map.Entry<K,V>> comparator)
K - 键类型V - 值类型entryCollection - Entry集合comparator - ComparatorLinkedListpublic static <K,V> LinkedHashMap<K,V> sortByEntry(Map<K,V> map, Comparator<Map.Entry<K,V>> comparator)
K - 键类型V - 值类型map - 被排序的Mapcomparator - ComparatorLinkedListpublic static <K,V> List<Map.Entry<K,V>> sortEntryToList(Collection<Map.Entry<K,V>> collection)
K - 键类型V - 值类型collection - 被排序的Collectionpublic static <T> List<List<T>> group(Collection<T> collection, CollKit.Hash<T> hash)
CollKit.Hash接口定义的hash算法,集合中的元素放入hash值对应的子列表中T - 元素类型collection - 被分组的集合hash - Hash值算法,决定元素放在第几个分组的规则public static <T> List<List<T>> groupByField(Collection<T> collection, String fieldName)
T - 元素类型collection - 集合fieldName - 元素Bean中的字段名,非Bean都放在第一个分组中public static <T> void forEach(Iterator<T> iterator, CollKit.Consumer<T> consumer)
Iterator,使用CollKit.Consumer 接受遍历的每条数据,并针对每条数据做处理T - 集合元素类型iterator - Iteratorconsumer - CollKit.Consumer 遍历的每条数据处理器public static <T> void forEach(Enumeration<T> enumeration, CollKit.Consumer<T> consumer)
Enumeration,使用CollKit.Consumer 接受遍历的每条数据,并针对每条数据做处理T - 集合元素类型enumeration - Enumerationconsumer - CollKit.Consumer 遍历的每条数据处理器public static <K,V> void forEach(Map<K,V> map, CollKit.KVConsumer<K,V> kvConsumer)
CollKit.KVConsumer 接受遍历的每条数据,并针对每条数据做处理K - Key类型V - Value类型map - MapkvConsumer - CollKit.KVConsumer 遍历的每条数据处理器public static <T> List<T> reverse(List<T> list)
T - 元素类型list - 被反转的Listpublic static <T> List<T> reverse(List<T> list, boolean clone)
T - 元素类型list - 被反转的Listclone - 是否克隆public static Object forceGetFieldValue(Object obj, String fieldName) throws Exception
obj - 属性名称所在的对象fieldName - 属性名称Exception - 异常public static <T> List<T> setOrAppend(List<T> list, int index, T element)
T - 对象list - List列表index - 位置element - 新元素public static int[] transToStartEnd(int pageNo,
int pageSize)
pageNo - 页码(从1计数)pageSize - 每页条目数public static int totalPage(int totalCount,
int pageSize)
totalCount - 总数pageSize - 每页数public static int[] rainbow(int currentPage,
int pageCount,
int displayCount)
currentPage - 当前页pageCount - 总页数displayCount - 每屏展示的页数public static int[] rainbow(int currentPage,
int pageCount)
currentPage - 当前页pageCount - 总页数public static <T> Optional<T> firstNotNullElem(Collection<T> list)
T - 泛型list - 列表public static <T> T[] concat(T[] one,
T[] other,
Class<T> clazz)
T - 对象one - 数组1other - 数组2clazz - 数组类public static <E> Set<E> ofImmutableSet(E... es)
E - 泛型es - 对象public static <E> List<E> ofImmutableList(E... es)
E - 泛型es - 对象public static <K> Set<K> keySet(Collection<Map<K,?>> mapCollection)
K - 键类型mapCollection - Map列表public static <V> List<V> values(Collection<Map<?,V>> mapCollection)
V - 值类型mapCollection - Map列表public static <T extends Comparable<? super T>> T max(Collection<T> coll)
T - 元素类型coll - 集合Collections.max(Collection)public static <T extends Comparable<? super T>> T min(Collection<T> coll)
T - 元素类型coll - 集合Collections.min(Collection)public static <T> int[] indexOfAll(Collection<T> collection, Matcher<T> matcher)
T - 元素类型collection - 集合matcher - 匹配器,为空则全部匹配public static void clear(Collection<?>... collections)
collections - 一个或多个集合Copyright © 2020. All rights reserved.