流工具-StreamUtil
StreamUtil是Hutool中用于简化和增强JDK Stream API的核心工具类,提供了丰富的流创建、操作和处理方法,让流操作更加便捷和强大。
# 1. 流的创建
# 1.1 从集合创建流
// 从List创建流
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = StreamUtil.of(list);
// 从Set创建流
Set<String> set = new HashSet<>(list);
Stream<String> setStream = StreamUtil.of(set);
# 1.2 从数组创建流
// 从数组创建流
String[] array = {"a", "b", "c"};
Stream<String> arrayStream = StreamUtil.of(array);
// 从基本类型数组创建流
int[] intArray = {1, 2, 3};
IntStream intStream = StreamUtil.of(intArray);
# 1.3 从迭代器创建流
// 从Iterator创建流
Iterator<String> iterator = list.iterator();
Stream<String> iteratorStream = StreamUtil.of(iterator);
// 从Iterable创建流
Iterable<String> iterable = list;
Stream<String> iterableStream = StreamUtil.of(iterable);
# 1.4 创建空流
// 创建空流
Stream<String> emptyStream = StreamUtil.empty();
# 2. 流的转换
# 2.1 转换为集合
// 流转换为List
List<String> resultList = StreamUtil.toList(stream);
// 流转换为Set
Set<String> resultSet = StreamUtil.toSet(stream);
// 流转换为数组
String[] resultArray = StreamUtil.toArray(stream, String.class);
# 2.2 转换为Map
// 流转换为Map
List<User> users = Arrays.asList(new User(1, "张三"), new User(2, "李四"));
Map<Integer, User> userMap = StreamUtil.toMap(users, User::getId, Function.identity());
// 流转换为Map,处理重复键
Map<Integer, User> userMap = StreamUtil.toMap(users, User::getId, Function.identity(), (existing, replacement) -> existing);
# 3. 流的操作
# 3.1 过滤操作
// 过滤非空元素
List<String> list = Arrays.asList("a", null, "b", "", "c");
List<String> nonEmptyList = StreamUtil.filter(list, StrUtil::isNotEmpty);
// 过滤符合条件的元素
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = StreamUtil.filter(numbers, num -> num % 2 == 0);
# 3.2 映射操作
// 映射为新的值
List<String> strings = Arrays.asList("1", "2", "3");
List<Integer> integers = StreamUtil.map(strings, Integer::parseInt);
// 扁平映射
List<List<Integer>> nestedList = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4));
List<Integer> flatList = StreamUtil.flatMap(nestedList, List::stream);
# 3.3 排序操作
// 自然排序
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
List<Integer> sortedList = StreamUtil.sorted(numbers);
// 自定义排序
List<User> users = Arrays.asList(new User(2, "李四"), new User(1, "张三"));
List<User> sortedUsers = StreamUtil.sorted(users, Comparator.comparing(User::getId));
# 3.4 去重操作
// 去重
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctList = StreamUtil.distinct(numbers);
// 根据属性去重
List<User> users = Arrays.asList(new User(1, "张三"), new User(1, "张三"));
List<User> distinctUsers = StreamUtil.distinctBy(users, User::getId);
# 4. 流的聚合
# 4.1 统计操作
// 计数
List<String> list = Arrays.asList("a", "b", "c");
long count = StreamUtil.count(list);
// 求和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = StreamUtil.sum(numbers);
// 平均值
OptionalDouble average = StreamUtil.average(numbers);
# 4.2 最值操作
// 最大值
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = StreamUtil.max(numbers);
// 最小值
Optional<Integer> min = StreamUtil.min(numbers);
// 根据属性求最大值
List<User> users = Arrays.asList(new User(1, "张三"), new User(2, "李四"));
Optional<User> maxUser = StreamUtil.maxBy(users, User::getId);
# 5. 流的其他操作
# 5.1 并行流
// 获取并行流
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> parallelStream = StreamUtil.parallel(list);
# 5.2 限制和跳过
// 限制数量
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedList = StreamUtil.limit(numbers, 3);
// 跳过元素
List<Integer> skippedList = StreamUtil.skip(numbers, 2);
# 5.3 匹配操作
// 全部匹配
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = StreamUtil.allMatch(numbers, num -> num > 0);
// 任意匹配
boolean anyMatch = StreamUtil.anyMatch(numbers, num -> num > 3);
// 无匹配
boolean noneMatch = StreamUtil.noneMatch(numbers, num -> num < 0);
# 6. 适用场景
StreamUtil适用于以下场景:
- 需要从各种数据源便捷地创建流时
- 需要简化流的转换和收集操作时
- 需要使用更友好的API进行流操作时
- 需要对集合、数组等数据进行复杂处理时
- 希望使用函数式编程风格处理数据时
通过StreamUtil,开发者可以更加便捷地使用流操作,编写更简洁、更易维护的代码,同时享受到函数式编程带来的好处。