迭代器工具 - IterUtil
# 迭代器工具 - IterUtil
简介
IterUtil
是 Hutool 提供的一个专门处理 Iterator
和 Iterable
的工具类。最早这些方法存在于 CollUtil
中,但由于其通用性强,经过抽象后独立出来,以适应更多场景。IterUtil
提供了多种用于处理迭代器的实用方法,包括判断迭代器是否为空、元素类型推断、集合计数、类型转换等。
# 1. 判断迭代器是否为空
isEmpty
和 isNotEmpty
用于判断一个 Iterator
或 Iterable
是否为空或至少包含一个元素。
# 示例:判断迭代器是否为空
import cn.hutool.core.collection.IterUtil;
import java.util.Iterator;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个空的迭代器
Iterator<String> emptyIterator = List.<String>of().iterator();
// 判断是否为空
boolean isEmpty = IterUtil.isEmpty(emptyIterator);
System.out.println("空迭代器是否为空: " + isEmpty); // true
// 初始化一个非空的迭代器
Iterator<String> nonEmptyIterator = List.of("a", "b").iterator();
// 判断是否为非空
boolean isNotEmpty = IterUtil.isNotEmpty(nonEmptyIterator);
System.out.println("非空迭代器是否为非空: " + isNotEmpty); // true
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
isEmpty(Iterator<?> iterator)
:判断迭代器是否为空或无元素。isNotEmpty(Iterator<?> iterator)
:判断迭代器是否为非空且至少包含一个元素。
- 参数:
iterator
: 需要判断的Iterator
对象。
- 返回值:
boolean
,true
表示迭代器为空或无元素,false
表示迭代器非空。 - 作用:用于基础判断,适合需要在处理数据前进行空检查的场景。
- 实际开发场景:在遍历集合、处理批量数据时,可以使用该方法先进行空判断,避免空指针异常。
# 2. 判断是否包含 null
元素
hasNull
和 isAllNull
用于判断迭代器中是否包含 null
元素,或者全部元素是否均为 null
。
# 示例:判断是否包含 null
元素
import cn.hutool.core.collection.IterUtil;
import java.util.Iterator;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化包含 null 的迭代器
Iterator<String> iterator = List.of("a", null, "c").iterator();
// 判断是否有 null 元素
boolean hasNull = IterUtil.hasNull(iterator);
System.out.println("是否包含 null 元素: " + hasNull); // true
// 初始化全部为 null 的迭代器
Iterator<String> allNullIterator = List.of(null, null, null).iterator();
// 判断是否全部为 null
boolean isAllNull = IterUtil.isAllNull(allNullIterator);
System.out.println("是否全部为 null 元素: " + isAllNull); // true
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
hasNull(Iterator<?> iterator)
:判断迭代器中是否包含null
元素。isAllNull(Iterator<?> iterator)
:判断迭代器中是否全部为null
元素。
- 参数:
iterator
: 需要判断的Iterator
对象。
- 返回值:
boolean
,true
表示包含或全部为null
,false
表示没有null
元素。 - 作用:用于数据校验,适合需要检查数据完整性或处理空值的场景。
- 实际开发场景:在数据导入、数据清洗等场景中,可以使用这些方法进行空值检查。
# 3. 元素计数
countMap
方法根据集合中元素的出现次数生成一个计数 Map
,即以元素为键,出现次数为值。
# 示例:统计元素出现次数
import cn.hutool.core.collection.IterUtil;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个包含重复元素的迭代器
Iterator<String> iterator = List.of("a", "b", "a", "c", "b", "a").iterator();
// 获取元素计数 Map
Map<String, Integer> countMap = IterUtil.countMap(iterator);
// 输出计数结果
countMap.forEach((key, value) -> System.out.println(key + " 出现次数: " + value));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 方法签名:
<T> Map<T, Integer> countMap(Iterator<T> iterator)
- 参数:
iterator
: 需要统计的Iterator
对象。
- 返回值:
Map<T, Integer>
,键为元素,值为该元素的出现次数。 - 作用:用于快速统计集合中元素的频率,适合分析数据分布的场景。
- 实际开发场景:在处理日志数据、投票系统、商品分类统计时,可以使用该方法统计各元素的出现频率。
# 4. 迭代器与 Iterable
互转
asIterator
和 asIterable
分别用于将 Enumeration
转为 Iterator
,将 Iterator
转为 Iterable
。
# 示例:迭代器与 Iterable
互转
import cn.hutool.core.collection.IterUtil;
import java.util.Iterator;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个列表
List<String> list = List.of("a", "b", "c");
// 将列表转换为迭代器
Iterator<String> iterator = list.iterator();
// 将迭代器转换为 Iterable
Iterable<String> iterable = IterUtil.asIterable(iterator);
// 通过 Iterable 遍历元素
for (String item : iterable) {
System.out.println(item);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
asIterator(Enumeration<E> enumeration)
:将Enumeration
转为Iterator
。asIterable(Iterator<E> iterator)
:将Iterator
转为Iterable
。
- 参数:
enumeration
: 需要转换的Enumeration
对象。iterator
: 需要转换的Iterator
对象。
- 返回值:
Iterator<E>
或Iterable<E>
,根据具体方法返回对应的转换对象。 - 作用:用于将不同类型的迭代器互相转换,增强通用性和灵活性。
- 实际开发场景:在需要兼容旧代码或适配多种数据结构时,可以使用这些方法进行迭代器转换。
# 5. 获取列表的第一个元素
getFirst
方法用于获取列表或迭代器中的第一个元素,适用于快速访问第一个元素的场景。
# 示例:获取第一个元素
import cn.hutool.core.collection.IterUtil;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个列表
List<String> list = List.of("a", "b", "c");
// 获取第一个元素
String firstElement = IterUtil.getFirst(list);
System.out.println("第一个元素: " + firstElement); // a
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 方法签名:
<T> T getFirst(Iterable<T> iterable)
- 参数:
iterable
: 需要操作的Iterable
对象。
- 返回值:
T
,返回第一个元素,若无元素则返回null
。 - 作用:在只关心列表第一个元素的场景中,快速获取该元素。
- 实际开发场景:在处理需要快速获取列表开头数据的场景中,可以使用该方法。
# 6. 获取元素类型
getElementType
方法用于推断 Iterator
或 Iterable
中元素的类型。
# 示例:获取元素类型
import cn.hutool.core.collection.IterUtil;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个列表
List<String> list = List.of("a", "b", "c");
// 获取元素类型
Class<?> elementType = IterUtil.getElementType(list);
System.out.println("元素类型: " + elementType.getSimpleName()); // String
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 方法签名:
<T> Class<?> getElementType(Iterable<T> iterable)
- 参数:
iterable
: 需要操作的Iterable
对象。
- 返回值:
Class<?>
,返回推断的元素类型,若无法确定类型则返回null
。 - 作用:在泛型编程或处理不确定类型的集合时,可以用来推断元素的实际类型。
- 实际开发场景:在需要动态判断集合中元素类型的场景中,可以使用该方法,如在编写泛型代码时。
# 7. 使用分隔符将集合转换为字符串
join
方法用于将集合中的元素按照指定的分隔符拼接为字符串。
# 示例:将集合转换为字符串
import cn.hutool.core.collection.IterUtil;
import java.util.List;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个列表
List<String> list = List.of("a", "b", "c");
// 使用逗号作为分隔符拼接字符串
String joinedString = IterUtil.join(list, ", ");
System.out.println("拼接后的字符串: " + joinedString); // a, b, c
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 方法签名:
String join(Iterable<?> iterable, CharSequence delimiter)
- 参数:
iterable
: 需要拼接的Iterable
对象。delimiter
: 分隔符,CharSequence
类型。
- 返回值:
String
,返回拼接后的字符串。 - 作用:快速将集合中的元素拼接为字符串,适用于日志输出、字符串组合等场景。
- 实际开发场景:在生成动态内容、格式化输出时,可以使用该方法。
# 8. 将 Entry
列表转为 Map
toMap
方法用于将包含 Entry
对象的列表转换为 Map
,或将两个列表分别作为键和值合并为 Map
。
# 示例:将 Entry
列表转换为 Map
import cn.hutool.core.collection.IterUtil;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
public class IterUtilExample {
public static void main(String[] args) {
// 初始化一个 Entry 列表
List<Map.Entry<String, Integer>> entryList = List.of(
new AbstractMap.SimpleEntry<>("a", 1),
new AbstractMap.SimpleEntry<>("b", 2),
new AbstractMap.SimpleEntry<>("c", 3)
);
// 将 Entry 列表转换为 Map
Map<String, Integer> map = IterUtil.toMap(entryList);
// 输出 Map
map.forEach((key, value) -> System.out.println(key + " = " + value));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
<K, V> Map<K, V> toMap(Iterable<? extends Map.Entry<K, V>> entryIterable)
- 参数:
entryIterable
: 包含Map.Entry
对象的Iterable
。
- 返回值:
Map<K, V>
,返回转换后的Map
。 - 作用:用于从
Entry
列表快速生成Map
,适用于需要动态构建Map
的场景。 - 实际开发场景:在处理配置项或解析数据结构时,可以使用该方法生成键值对映射。
以上是 Hutool 中 IterUtil
工具类的详细总结,包括各个 API 的作用、参数说明、使用场景,以及完整的代码示例。如果你还有其他需要讨论的内容,欢迎随时告诉我!
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08