/* * Copyright 2025 mingliqiye * * Licensed 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. * * ProjectName mingli-utils * ModuleName mingli-utils.main * CurrentFile Collection.kt * LastUpdate 2025-09-21 14:36:57 * UpdateUser MingLiPro */ @file:JvmName("Collections") package com.mingliqiye.utils.collection import com.mingliqiye.utils.stream.SuperStream import java.util.* import java.util.stream.Collectors /** * 将当前集合转换为数组。 * * @param T 集合元素类型 * @return 转换后的数组 */ inline fun Collection.toArray(): Array { return arrayOf(*this.toTypedArray()) } /** * 将当前集合转换为 Map,其中键为集合元素本身,值由给定函数生成。 * * @param T 集合元素类型 * @param V 映射值的类型 * @param v 用于生成映射值的函数 * @return 转换后的 Map */ @Suppress("UNCHECKED_CAST") inline fun Collection.toMap(noinline v: (T) -> V): Map { return this.stream().collect( SuperStream.toMap( v ) ) as Map } /** * 将当前集合转换为 Map,其中键和值分别由给定函数生成。 * * @param T 集合元素类型 * @param V 映射值的类型 * @param K 映射键的类型 * @param k 用于生成映射键的函数 * @param v 用于生成映射值的函数 * @return 转换后的 Map */ inline fun Collection.toMap(noinline k: (T) -> K, noinline v: (T) -> V): Map { return this.stream().collect( Collectors.toMap( k, v ) ) } /** * 将数组转换为 Set。 * * @param T 数组元素类型 * @param array 输入数组 * @return 转换后的 Set */ fun toSet(array: Array): Set { return array.toSet() } /** * 获取集合中的第一个元素,如果集合为空则返回 null。 * * @param T 集合元素类型 * @return 第一个元素或 null */ inline fun Collection.getFirst(): T? { if (this.isEmpty()) { return null } if (this is MutableList) { return this.first() } return this.iterator().next() } /** * 获取数组中的第一个元素,如果数组为空则返回 null。 * * @param T 数组元素类型 * @return 第一个元素或 null */ inline fun Array.getFirst(): T? { if (this.isEmpty()) { return null } return this.first() } /** * 获取集合中的最后一个元素,如果集合为空则返回 null。 * * @param T 集合元素类型 * @return 最后一个元素或 null */ inline fun Collection.getLast(): T? { if (this.isEmpty()) { return null } if (this is MutableList) { return this.last() } var lastElement: T? = null for (element in this) { lastElement = element } return lastElement } /** * 获取数组中的最后一个元素,如果数组为空则返回 null。 * * @param T 数组元素类型 * @return 最后一个元素或 null */ inline fun Array.getLast(): T? { if (this.isEmpty()) { return null } return this.last() } /** * 根据索引获取集合中的元素,若索引越界则返回默认值。 * * @param T 集合元素类型 * @param index 索引位置 * @param defaultValue 默认返回值 * @return 指定索引处的元素或默认值 */ inline fun Collection.getOrDefault( index: Int, defaultValue: T ): T { if (!(!this.isEmpty() && index < this.size)) { return defaultValue } if (this is List) { return this[index] } var i = 0 for (element in this) { if (i == index) { return element } i++ } return defaultValue } /** * 创建一个新的 ArrayList 实例。 * * @param T 元素类型 * @return 新创建的 ArrayList */ fun newArrayList(): ArrayList { return ArrayList() } /** * 创建一个指定初始容量的新 ArrayList 实例。 * * @param T 元素类型 * @param size 初始容量大小 * @return 新创建的 ArrayList */ fun newArrayList(size: Int): ArrayList { return ArrayList() } /** * 使用可变参数创建一个新的 ArrayList 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 ArrayList */ fun newArrayList(vararg elements: T): ArrayList { return newArrayList(elements.asList()) } /** * 将当前集合转换为新的 ArrayList 实例。 * * @param T 元素类型 * @return 新创建的 ArrayList */ fun Collection.newArrayLists(): ArrayList { return newArrayList(this) } /** * 将数组转换为新的 ArrayList 实例。 * * @param T 元素类型 * @param elements 输入数组 * @return 新创建的 ArrayList */ fun newArrayLists(elements: Array): ArrayList { return newArrayList(elements.asList()) } /** * 将集合转换为新的 ArrayList 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 ArrayList */ fun newArrayList(elements: Collection): ArrayList { return ArrayList(elements.toList()) } /** * 将 Iterable 转换为新的 ArrayList 实例。 * * @param T 元素类型 * @param elements 输入 Iterable * @return 新创建的 ArrayList */ fun newArrayList(elements: Iterable): ArrayList { return newArrayList(elements.toList()) } /** * 将 Sequence 转换为新的 ArrayList 实例。 * * @param T 元素类型 * @param elements 输入 Sequence * @return 新创建的 ArrayList */ fun newArrayList(elements: Sequence): ArrayList { return newArrayList(elements.toList()) } /** * 创建一个新的 LinkedList 实例。 * * @param T 元素类型 * @return 新创建的 LinkedList */ fun newLinkedList(): LinkedList { return LinkedList() } /** * 使用可变参数创建一个新的 LinkedList 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 LinkedList */ fun newLinkedList(vararg elements: T): LinkedList { val list = newLinkedList() list.addAll(elements.asList()) return list } /** * 将集合转换为新的 LinkedList 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 LinkedList */ fun newLinkedList(elements: Collection): LinkedList { val list = newLinkedList() list.addAll(elements) return list } /** * 将 Iterable 转换为新的 LinkedList 实例。 * * @param T 元素类型 * @param elements 输入 Iterable * @return 新创建的 LinkedList */ fun newLinkedList(elements: Iterable): LinkedList { val list = newLinkedList() for (element in elements) { list.add(element) } return list } /** * 将 Sequence 转换为新的 LinkedList 实例。 * * @param T 元素类型 * @param elements 输入 Sequence * @return 新创建的 LinkedList */ fun newLinkedList(elements: Sequence): LinkedList { return newLinkedList(elements.toList()) } /** * 创建一个新的 Vector 实例。 * * @param T 元素类型 * @return 新创建的 Vector */ fun newVector(): Vector { return Vector() } /** * 使用可变参数创建一个新的 Vector 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 Vector */ fun newVector(vararg elements: T): Vector { val vector = newVector() vector.addAll(elements.asList()) return vector } /** * 将集合转换为新的 Vector 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 Vector */ fun newVector(elements: Collection): Vector { val vector = newVector() vector.addAll(elements) return vector } /** * 将 Iterable 转换为新的 Vector 实例。 * * @param T 元素类型 * @param elements 输入 Iterable * @return 新创建的 Vector */ fun newVector(elements: Iterable): Vector { val vector = newVector() for (element in elements) { vector.add(element) } return vector } /** * 将 Sequence 转换为新的 Vector 实例。 * * @param T 元素类型 * @param elements 输入 Sequence * @return 新创建的 Vector */ fun newVector(elements: Sequence): Vector { return newVector(elements.toList()) } /** * 创建一个新的 HashSet 实例。 * * @param T 元素类型 * @return 新创建的 HashSet */ fun newHashSet(): HashSet { return HashSet() } /** * 创建一个指定初始容量的新 HashSet 实例。 * * @param T 元素类型 * @param size 初始容量大小 * @return 新创建的 HashSet */ fun newHashSet(size: Int): HashSet { return HashSet(size) } /** * 使用可变参数创建一个新的 HashSet 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 HashSet */ fun newHashSet(vararg elements: T): HashSet { val set = newHashSet() set.addAll(elements.asList()) return set } /** * 将集合转换为新的 HashSet 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 HashSet */ fun newHashSet(elements: Collection): HashSet { val set = newHashSet() set.addAll(elements) return set } /** * 将 Iterable 转换为新的 HashSet 实例。 * * @param T 元素类型 * @param elements 输入 Iterable * @return 新创建的 HashSet */ fun newHashSet(elements: Iterable): HashSet { val set = newHashSet() for (element in elements) { set.add(element) } return set } /** * 将 Sequence 转换为新的 HashSet 实例。 * * @param T 元素类型 * @param elements 输入 Sequence * @return 新创建的 HashSet */ fun newHashSet(elements: Sequence): HashSet { return newHashSet(elements.toSet()) } /** * 创建一个新的 LinkedHashSet 实例。 * * @param T 元素类型 * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(): LinkedHashSet { return LinkedHashSet() } /** * 创建一个指定初始容量的新 LinkedHashSet 实例。 * * @param T 元素类型 * @param size 初始容量大小 * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(size: Int): LinkedHashSet { return LinkedHashSet(size) } /** * 使用可变参数创建一个新的 LinkedHashSet 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(vararg elements: T): LinkedHashSet { val set = newLinkedHashSet() set.addAll(elements.asList()) return set } /** * 将集合转换为新的 LinkedHashSet 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(elements: Collection): LinkedHashSet { val set = newLinkedHashSet() set.addAll(elements) return set } /** * 将 Iterable 转换为新的 LinkedHashSet 实例。 * * @param T 元素类型 * @param elements 输入 Iterable * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(elements: Iterable): LinkedHashSet { val set = newLinkedHashSet() for (element in elements) { set.add(element) } return set } /** * 将 Sequence 转换为新的 LinkedHashSet 实例。 * * @param T 元素类型 * @param elements 输入 Sequence * @return 新创建的 LinkedHashSet */ fun newLinkedHashSet(elements: Sequence): LinkedHashSet { return newLinkedHashSet(elements.toSet()) } /** * 创建一个新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @return 新创建的 TreeSet */ fun > newTreeSet(): TreeSet { return TreeSet() } /** * 使用可变参数创建一个新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @param elements 可变参数列表 * @return 新创建的 TreeSet */ fun > newTreeSet(vararg elements: T): TreeSet { val set = newTreeSet() set.addAll(elements.asList()) return set } /** * 将集合转换为新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @param elements 输入集合 * @return 新创建的 TreeSet */ fun > newTreeSet(elements: Collection): TreeSet { val set = newTreeSet() set.addAll(elements) return set } /** * 将 Iterable 转换为新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @param elements 输入 Iterable * @return 新创建的 TreeSet */ fun > newTreeSet(elements: Iterable): TreeSet { val set = newTreeSet() for (element in elements) { set.add(element) } return set } /** * 将 Sequence 转换为新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @param elements 输入 Sequence * @return 新创建的 TreeSet */ fun > newTreeSet(elements: Sequence): TreeSet { return newTreeSet(elements.toSet()) } /** * 将字节数组转换为 ArrayList。 * * @param elements 输入字节数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: ByteArray): ArrayList { return ArrayList(elements.toList()) } /** * 将短整型数组转换为 ArrayList。 * * @param elements 输入短整型数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: ShortArray): ArrayList { return ArrayList(elements.toList()) } /** * 将整型数组转换为 ArrayList。 * * @param elements 输入整型数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: IntArray): ArrayList { return ArrayList(elements.toList()) } /** * 将长整型数组转换为 ArrayList。 * * @param elements 输入长整型数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: LongArray): ArrayList { return ArrayList(elements.toList()) } /** * 将浮点数组转换为 ArrayList。 * * @param elements 输入浮点数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: FloatArray): ArrayList { return ArrayList(elements.toList()) } /** * 将双精度浮点数组转换为 ArrayList。 * * @param elements 输入双精度浮点数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: DoubleArray): ArrayList { return ArrayList(elements.toList()) } /** * 将布尔数组转换为 ArrayList。 * * @param elements 输入布尔数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: BooleanArray): ArrayList { return ArrayList(elements.toList()) } /** * 将字符数组转换为 ArrayList。 * * @param elements 输入字符数组 * @return 转换后的 ArrayList */ fun newArrayLists(elements: CharArray): ArrayList { return ArrayList(elements.toList()) } /** * 创建一个新的 CopyOnWriteArrayList 实例。 * * @param T 元素类型 * @return 新创建的 CopyOnWriteArrayList */ fun newCopyOnWriteArrayList(): java.util.concurrent.CopyOnWriteArrayList { return java.util.concurrent.CopyOnWriteArrayList() } /** * 使用可变参数创建一个新的 CopyOnWriteArrayList 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 CopyOnWriteArrayList */ fun newCopyOnWriteArrayList(vararg elements: T): java.util.concurrent.CopyOnWriteArrayList { return java.util.concurrent.CopyOnWriteArrayList(elements.asList()) } /** * 将集合转换为新的 CopyOnWriteArrayList 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 CopyOnWriteArrayList */ fun newCopyOnWriteArrayList(elements: Collection): java.util.concurrent.CopyOnWriteArrayList { return java.util.concurrent.CopyOnWriteArrayList(elements) } /** * 创建一个新的 Stack 实例。 * * @param T 元素类型 * @return 新创建的 Stack */ fun newStack(): Stack { return Stack() } /** * 使用可变参数创建一个新的 Stack 实例。 * * @param T 元素类型 * @param elements 可变参数列表 * @return 新创建的 Stack */ fun newStack(vararg elements: T): Stack { val stack = newStack() stack.addAll(elements.asList()) return stack } /** * 将集合转换为新的 Stack 实例。 * * @param T 元素类型 * @param elements 输入集合 * @return 新创建的 Stack */ fun newStack(elements: Collection): Stack { val stack = newStack() stack.addAll(elements) return stack } /** * 创建一个新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @return 新创建的 TreeSet */ fun newTreeSet(comparator: Comparator): TreeSet { return TreeSet(comparator) } /** * 使用可变参数创建一个新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @param elements 可变参数列表 * @return 新创建的 TreeSet */ fun newTreeSet(comparator: Comparator, vararg elements: T): TreeSet { val set = newTreeSet(comparator) set.addAll(elements.asList()) return set } /** * 将集合转换为新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @param elements 输入集合 * @return 新创建的 TreeSet */ fun newTreeSet(comparator: Comparator, elements: Collection): TreeSet { val set = newTreeSet(comparator) set.addAll(elements) return set } /** * 将 Iterable 转换为新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @param elements 输入 Iterable * @return 新创建的 TreeSet */ fun newTreeSet(comparator: Comparator, elements: Iterable): TreeSet { val set = newTreeSet(comparator) for (element in elements) { set.add(element) } return set } /** * 将 Sequence 转换为新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @param elements 输入 Sequence * @return 新创建的 TreeSet */ fun newTreeSet(comparator: Comparator, elements: Sequence): TreeSet { return newTreeSet(comparator, elements.toSet()) } /** * 将当前集合转换为新的 CopyOnWriteArrayList 实例。 * * @param T 元素类型 * @return 新创建的 CopyOnWriteArrayList */ fun Collection.newCopyOnWriteArrayLists(): java.util.concurrent.CopyOnWriteArrayList { return java.util.concurrent.CopyOnWriteArrayList(this) } /** * 将当前集合转换为新的 Stack 实例。 * * @param T 元素类型 * @return 新创建的 Stack */ fun Collection.newStacks(): Stack { val stack = Stack() stack.addAll(this) return stack } /** * 将当前集合转换为新的 TreeSet 实例。 * * @param T 元素类型,必须实现 Comparable 接口 * @return 新创建的 TreeSet */ fun Collection.newTreeSets(): TreeSet where T : Comparable { val set = TreeSet() set.addAll(this) return set } /** * 将当前集合转换为新的 TreeSet 实例,并指定比较器。 * * @param T 元素类型 * @param comparator 用于排序的比较器 * @return 新创建的 TreeSet */ fun Collection.newTreeSets(comparator: Comparator): TreeSet { val set = TreeSet(comparator) set.addAll(this) return set } /** * 将 Byte 类型的 List 转换为字节数组。 * * @param list 输入的 Byte 列表 * @return 转换后的字节数组 */ fun toArray(list: List): ByteArray { val arr = ByteArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Short 类型的 List 转换为短整型数组。 * * @param list 输入的 Short 列表 * @return 转换后的短整型数组 */ fun toArray(list: List): ShortArray { val arr = ShortArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Int 类型的 List 转换为整型数组。 * * @param list 输入的 Int 列表 * @return 转换后的整型数组 */ fun toArray(list: List): IntArray { val arr = IntArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Long 类型的 List 转换为长整型数组。 * * @param list 输入的 Long 列表 * @return 转换后的长整型数组 */ fun toArray(list: List): LongArray { val arr = LongArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Float 类型的 List 转换为浮点数组。 * * @param list 输入的 Float 列表 * @return 转换后的浮点数组 */ fun toArray(list: List): FloatArray { val arr = FloatArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Double 类型的 List 转换为双精度浮点数组。 * * @param list 输入的 Double 列表 * @return 转换后的双精度浮点数组 */ fun toArray(list: List): DoubleArray { val arr = DoubleArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Boolean 类型的 List 转换为布尔数组。 * * @param list 输入的 Boolean 列表 * @return 转换后的布尔数组 */ fun toArray(list: List): BooleanArray { val arr = BooleanArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将 Char 类型的 List 转换为字符数组。 * * @param list 输入的 Char 列表 * @return 转换后的字符数组 */ fun toArray(list: List): CharArray { val arr = CharArray(list.size) for (i in list.indices) { arr[i] = list[i] } return arr } /** * 将任意类型的 List 转换为数组。 * * @param T 元素类型 * @param list 输入的 List * @return 转换后的数组 */ inline fun toArray(list: List): Array { if (list.isEmpty()) return arrayOf() return SuperStream.of(list) .toArray(T::class.java) } fun toArray(list: List, clazz: Class): Array { return SuperStream.of(list) .toArray(clazz) }