diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b5fd4098..5c9bcaac0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ ### 新特性 * 【crypto 】 KeyUtil增加重载,AES构造增加重载(issue#I25NNZ@Gitee) +* 【json 】 JSONUtil增加toList重载(issue#1228@Github) +* 【core 】 新增CollStreamUtil(issue#1228@Github) ### Bug修复 * 【cron 】 修复CronTimer可能死循环的问题(issue#1224@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java new file mode 100644 index 000000000..9fe63d6c9 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -0,0 +1,196 @@ +package cn.hutool.core.collection; + + +import cn.hutool.core.map.MapUtil; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 集合的stream操作封装 + * + * @author 528910437@QQ.COM + * @since 5.5.2 + */ +public class CollStreamUtil { + + /** + * 将collection转化为类型不变的map
+ * {@code Collection ----> Map} + * + * @param collection 需要转化的集合 + * @param key E类型转化为T类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @return 转化后的map + */ + public static Map toIdentityMap(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return Collections.emptyMap(); + } + return collection.stream().collect(Collectors.toMap(key, Function.identity())); + } + + /** + * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map } + * + * @param collection 需要转化的集合 + * @param key E类型转化为T类型的lambda方法 + * @param value E类型转化为U类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @param map中的value类型 + * @return 转化后的map + */ + public static Map toMap(Collection collection, Function key, Function value) { + if (CollUtil.isEmpty(collection)) { + return Collections.emptyMap(); + } + return collection.stream().collect(Collectors.toMap(key, value)); + } + + /** + * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> } + * + * @param collection 需要分类的集合 + * @param key 分类的规则 + * @param collection中的泛型 + * @param map中的key类型 + * @return 分类后的map + */ + public static Map> groupByKey(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return Collections.emptyMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key, Collectors.toList())); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 集合元素类型 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @return 分类后的map + */ + public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection)) { + return Collections.emptyMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, Collectors.groupingBy(key2, Collectors.toList()))); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map + *

+ * {@code Collection ---> Map> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @param collection中的泛型 + * @return 分类后的map + */ + public static Map> group2Map(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { + return Collections.emptyMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, Collectors.toMap(key2, Function.identity()))); + } + + /** + * 将collection转化为List集合,但是两者的泛型不同 + *

+ * {@code Collection ------> List } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为list泛型的lambda表达式 + * @param collection中的泛型 + * @param List中的泛型 + * @return 转化后的list + */ + public static List toList(Collection collection, Function function) { + if (CollUtil.isEmpty(collection)) { + return Collections.emptyList(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将collection转化为Set集合,但是两者的泛型不同 + *

+ * {@code Collection ------> Set } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为set泛型的lambda表达式 + * @param collection中的泛型 + * @param Set中的泛型 + * @return 转化后的Set + */ + public static Set toSet(Collection collection, Function function) { + if (CollUtil.isEmpty(collection) || function == null) { + return Collections.emptySet(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + + /** + * 合并两个相同key类型的map + * + * @param map1 第一个需要合并的 map + * @param map2 第二个需要合并的 map + * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 + * @param map中的key类型 + * @param 第一个 map的value类型 + * @param 第二个 map的value类型 + * @param 最终map的value类型 + * @return 合并后的map + */ + public static Map merge(Map map1, Map map2, BiFunction merge) { + if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { + return Collections.emptyMap(); + } else if (MapUtil.isEmpty(map1)) { + map1 = Collections.emptyMap(); + } else if (MapUtil.isEmpty(map2)) { + map2 = Collections.emptyMap(); + } + Set key = new HashSet<>(); + key.addAll(map1.keySet()); + key.addAll(map2.keySet()); + Map map = new HashMap<>(); + for (K t : key) { + X x = map1.get(t); + Y y = map2.get(t); + V z = merge.apply(x, y); + if (z != null) { + map.put(t, z); + } + } + return map; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollectionStream.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollectionStream.java deleted file mode 100644 index 4a6a79fbf..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollectionStream.java +++ /dev/null @@ -1,202 +0,0 @@ -package cn.hutool.core.collection; - - -import cn.hutool.core.map.MapUtil; - -import java.util.*; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 常用stream操作集合

- * 做这个集合的封装的原因在于list.stream后续的写法虽然简便,但是别人看不易不懂,甚至自己写了两周后都看不懂,维护成本高

- * 于是笔者采用见名知意的方法封装,降低阅读难度,减轻了维护成本,使用者只需要提供一些简单的lambda表达式

- * 当然本人才疏学浅,名字未必能够做到信雅达,欢迎各位大佬指教

- * 另外,CollectionStream封装的都是一些常用的stream方法,当然考虑到一些方法不常用(比如map->list),并未提交,如果有一些好的意见,欢迎联系本人528910437@QQ.COM - * - * @version 1.0 - */ -public class CollectionStream { - /** - * 将collection转化为类型不变的map - *

- * {@code Collection ----> Map} - * - * @param collection 需要转化的集合 - * @param key E类型转化为T类型的lambda方法 - * @param collection中的泛型 - * @param map中的key类型 - * @return 转化后的map - */ - public static Map toIdentityMap(Collection collection, Function key) { - if (CollUtil.isEmpty(collection)) { - return Collections.EMPTY_MAP; - } - return collection.stream().collect(Collectors.toMap(key, Function.identity())); - } - - /** - * E - * 将collection转化为map(value类型与collection的泛型不同) - *

- * {@code Collection -----> Map } - * - * @param collection 需要转化的集合 - * @param key E类型转化为T类型的lambda方法 - * @param value E类型转化为U类型的lambda方法 - * @param collection中的泛型 - * @param map中的key类型 - * @param map中的value类型 - * @return 转化后的map - */ - public static Map toMap(Collection collection, Function key, Function value) { - if (CollUtil.isEmpty(collection)) { - return Collections.EMPTY_MAP; - } - return collection.stream().collect(Collectors.toMap(key, value)); - } - - /** - * 将collection按照规则(比如有相同的班级id)分类成map - *

- * {@code Collection -------> Map> } - * - * @param collection 需要分类的集合 - * @param key 分类的规则 - * @param collection中的泛型 - * @param map中的key类型 - * @return 分类后的map - */ - public static Map> groupByKey(Collection collection, Function key) { - if (CollUtil.isEmpty(collection)) { - return Collections.EMPTY_MAP; - } - return collection - .stream() - .collect(Collectors.groupingBy(key, Collectors.toList())); - } - - /** - * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map - *

- * {@code Collection ---> Map>> } - * - * @param collection 需要分类的集合 - * @param key1 第一个分类的规则 - * @param key2 第二个分类的规则 - * @param 第一个map中的key类型 - * @param 第二个map中的key类型 - * @return 分类后的map - */ - public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { - if (CollUtil.isEmpty(collection)) { - return Collections.EMPTY_MAP; - } - return collection - .stream() - .collect(Collectors.groupingBy(key1, Collectors.groupingBy(key2, Collectors.toList()))); - } - - /** - * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map - *

- * {@code Collection ---> Map> } - * - * @param collection 需要分类的集合 - * @param key1 第一个分类的规则 - * @param key2 第二个分类的规则 - * @param 第一个map中的key类型 - * @param 第二个map中的key类型 - * @param collection中的泛型 - * @return 分类后的map - */ - public static Map> group2Map(Collection collection, Function key1, Function key2) { - if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { - return Collections.EMPTY_MAP; - } - return collection - .stream() - .collect(Collectors.groupingBy(key1, Collectors.toMap(key2, Function.identity()))); - } - - /** - * 将collection转化为List集合,但是两者的泛型不同 - *

- * {@code Collection ------> List } - * - * @param collection 需要转化的集合 - * @param function collection中的泛型转化为list泛型的lambda表达式 - * @param collection中的泛型 - * @param List中的泛型 - * @return 转化后的list - */ - public static List translate2List(Collection collection, Function function) { - if (CollUtil.isEmpty(collection)) { - return Collections.EMPTY_LIST; - } - return collection - .stream() - .map(function) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - /** - * 将collection转化为Set集合,但是两者的泛型不同 - *

- * {@code Collection ------> Set } - * - * @param collection 需要转化的集合 - * @param function collection中的泛型转化为set泛型的lambda表达式 - * @param collection中的泛型 - * @param Set中的泛型 - * @return 转化后的Set - */ - public static Set translate2Set(Collection collection, Function function) { - if (CollUtil.isEmpty(collection) || function == null) { - return Collections.EMPTY_SET; - } - return collection - .stream() - .map(function) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } - - - /** - * 合并两个相同key类型的map - * - * @param map1 第一个需要合并的 map - * @param map2 第二个需要合并的 map - * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 - * @param map中的key类型 - * @param 第一个 map的value类型 - * @param 第二个 map的value类型 - * @param 最终map的value类型 - * @return 合并后的map - */ - public static Map merge(Map map1, Map map2, BiFunction merge) { - if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { - return Collections.EMPTY_MAP; - } else if (MapUtil.isEmpty(map1)) { - map1 = Collections.EMPTY_MAP; - } else if (MapUtil.isEmpty(map2)) { - map2 = Collections.EMPTY_MAP; - } - Set key = new HashSet<>(); - key.addAll(map1.keySet()); - key.addAll(map2.keySet()); - Map map = new HashMap<>(); - for (T t : key) { - X x = map1.get(t); - Y y = map2.get(t); - Z z = merge.apply(x, y); - if (z != null) { - map.put(t, z); - } - } - return map; - } -} diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java new file mode 100644 index 000000000..2d56c0495 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java @@ -0,0 +1,232 @@ +package cn.hutool.core.collection; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.ToString; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * CollectionStream测试方法 + */ +public class CollStreamUtilTest { + @Test + public void testToIdentityMap() { + Map map = CollStreamUtil.toIdentityMap(null, Student::getStudentId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + List list = new ArrayList<>(); + map = CollStreamUtil.toIdentityMap(list, Student::getStudentId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + list.add(new Student(1, 1, 1, "张三")); + list.add(new Student(1, 1, 2, "李四")); + list.add(new Student(1, 1, 3, "王五")); + map = CollStreamUtil.toIdentityMap(list, Student::getStudentId); + Assert.assertEquals(map.get(1L).getName(), "张三"); + Assert.assertEquals(map.get(2L).getName(), "李四"); + Assert.assertEquals(map.get(3L).getName(), "王五"); + Assert.assertNull(map.get(4L)); + } + + @Test + public void testToMap() { + Map map = CollStreamUtil.toMap(null, Student::getStudentId, Student::getName); + Assert.assertEquals(map, Collections.EMPTY_MAP); + List list = new ArrayList<>(); + map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName); + Assert.assertEquals(map, Collections.EMPTY_MAP); + list.add(new Student(1, 1, 1, "张三")); + list.add(new Student(1, 1, 2, "李四")); + list.add(new Student(1, 1, 3, "王五")); + map = CollStreamUtil.toMap(list, Student::getStudentId, Student::getName); + Assert.assertEquals(map.get(1L), "张三"); + Assert.assertEquals(map.get(2L), "李四"); + Assert.assertEquals(map.get(3L), "王五"); + Assert.assertNull(map.get(4L)); + } + + @Test + public void testGroupByKey() { + Map> map = CollStreamUtil.groupByKey(null, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + List list = new ArrayList<>(); + map = CollStreamUtil.groupByKey(list, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + list.add(new Student(1, 1, 1, "张三")); + list.add(new Student(1, 2, 2, "李四")); + list.add(new Student(2, 1, 1, "擎天柱")); + list.add(new Student(2, 2, 2, "威震天")); + list.add(new Student(2, 3, 2, "霸天虎")); + map = CollStreamUtil.groupByKey(list, Student::getClassId); + Map> compare = new HashMap<>(); + List class1 = new ArrayList<>(); + class1.add(new Student(1, 1, 1, "张三")); + class1.add(new Student(2, 1, 1, "擎天柱")); + compare.put(1L, class1); + List class2 = new ArrayList<>(); + class2.add(new Student(1, 2, 2, "李四")); + class2.add(new Student(2, 2, 2, "威震天")); + + compare.put(2L, class2); + List class3 = new ArrayList<>(); + class3.add(new Student(2, 3, 2, "霸天虎")); + compare.put(3L, class3); + Assert.assertEquals(map, compare); + } + + public void testGroupBy2Key() { + Map>> map = CollStreamUtil.groupBy2Key(null, Student::getTermId, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + List list = new ArrayList<>(); + map = CollStreamUtil.groupBy2Key(list, Student::getTermId, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + list.add(new Student(1, 1, 1, "张三")); + list.add(new Student(1, 2, 2, "李四")); + list.add(new Student(1, 2, 3, "王五")); + list.add(new Student(2, 1, 1, "擎天柱")); + list.add(new Student(2, 2, 2, "威震天")); + list.add(new Student(2, 2, 3, "霸天虎")); + map = CollStreamUtil.groupBy2Key(list, Student::getTermId, Student::getClassId); + Map>> compare = new HashMap<>(); + Map> map1 = new HashMap<>(); + List list11 = new ArrayList<>(); + list11.add(new Student(1, 1, 1, "张三")); + map1.put(1L, list11); + compare.put(1L, map1); + List list12 = new ArrayList<>(); + list12.add(new Student(1, 2, 2, "李四")); + list12.add(new Student(1, 2, 3, "王五")); + map1.put(2L, list12); + compare.put(2L, map1); + Map> map2 = new HashMap<>(); + List list21 = new ArrayList<>(); + list21.add(new Student(2, 1, 1, "擎天柱")); + map2.put(1L, list21); + compare.put(2L, map2); + + List list22 = new ArrayList<>(); + list22.add(new Student(2, 2, 2, "威震天")); + list22.add(new Student(2, 2, 3, "霸天虎")); + map2.put(2L, list22); + compare.put(2L, map2); + Assert.assertEquals(map, compare); + } + + @Test + public void testGroup2Map() { + Map> map = CollStreamUtil.group2Map(null, Student::getTermId, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + + List list = new ArrayList<>(); + map = CollStreamUtil.group2Map(list, Student::getTermId, Student::getClassId); + Assert.assertEquals(map, Collections.EMPTY_MAP); + list.add(new Student(1, 1, 1, "张三")); + list.add(new Student(1, 2, 1, "李四")); + list.add(new Student(2, 2, 1, "王五")); + map = CollStreamUtil.group2Map(list, Student::getTermId, Student::getClassId); + Map> compare = new HashMap<>(); + Map map1 = new HashMap<>(); + map1.put(1L, new Student(1, 1, 1, "张三")); + map1.put(2L, new Student(1, 2, 1, "李四")); + compare.put(1L, map1); + Map map2 = new HashMap<>(); + map2.put(2L, new Student(2, 2, 1, "王五")); + compare.put(2L, map2); + Assert.assertEquals(compare, map); + + } + + @Test + public void testTranslate2List() { + List list = CollStreamUtil.toList(null, Student::getName); + Assert.assertEquals(list, Collections.EMPTY_LIST); + List students = new ArrayList<>(); + list = CollStreamUtil.toList(students, Student::getName); + Assert.assertEquals(list, Collections.EMPTY_LIST); + students.add(new Student(1, 1, 1, "张三")); + students.add(new Student(1, 2, 2, "李四")); + students.add(new Student(2, 1, 1, "李四")); + students.add(new Student(2, 2, 2, "李四")); + students.add(new Student(2, 3, 2, "霸天虎")); + list = CollStreamUtil.toList(students, Student::getName); + List compare = new ArrayList<>(); + compare.add("张三"); + compare.add("李四"); + compare.add("李四"); + compare.add("李四"); + compare.add("霸天虎"); + Assert.assertEquals(list, compare); + } + + @Test + public void testTranslate2Set() { + Set set = CollStreamUtil.toSet(null, Student::getName); + Assert.assertEquals(set, Collections.EMPTY_SET); + List students = new ArrayList<>(); + set = CollStreamUtil.toSet(students, Student::getName); + Assert.assertEquals(set, Collections.EMPTY_SET); + students.add(new Student(1, 1, 1, "张三")); + students.add(new Student(1, 2, 2, "李四")); + students.add(new Student(2, 1, 1, "李四")); + students.add(new Student(2, 2, 2, "李四")); + students.add(new Student(2, 3, 2, "霸天虎")); + set = CollStreamUtil.toSet(students, Student::getName); + Set compare = new HashSet<>(); + compare.add("张三"); + compare.add("李四"); + compare.add("霸天虎"); + Assert.assertEquals(set, compare); + } + + @Test + public void testMerge() { + Map map1 = null; + Map map2 = Collections.emptyMap(); + Map map = CollStreamUtil.merge(map1, map2, (s1, s2) -> s1.getName() + s2.getName()); + Assert.assertEquals(map, Collections.EMPTY_MAP); + map1 = new HashMap<>(); + map1.put(1L, new Student(1, 1, 1, "张三")); + map = CollStreamUtil.merge(map1, map2, this::merge); + Map temp = new HashMap<>(); + temp.put(1L, "张三"); + Assert.assertEquals(map, temp); + map2 = new HashMap<>(); + map2.put(1L, new Student(2, 1, 1, "李四")); + map = CollStreamUtil.merge(map1, map2, this::merge); + Map compare = new HashMap<>(); + compare.put(1L, "张三李四"); + Assert.assertEquals(map, compare); + } + + private String merge(Student student1, Student student2) { + if (student1 == null && student2 == null) { + return null; + } else if (student1 == null) { + return student2.getName(); + } else if (student2 == null) { + return student1.getName(); + } else { + return student1.getName() + student2.getName(); + } + } + + /** + * 班级类 + */ + @Data + @AllArgsConstructor + @ToString + public static class Student { + private long termId;//学期id + private long classId;//班级id + private long studentId;//班级id + private String name;//学生名称 + } +} \ No newline at end of file diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollectionStreamTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollectionStreamTest.java deleted file mode 100644 index ffd848360..000000000 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollectionStreamTest.java +++ /dev/null @@ -1,276 +0,0 @@ -package cn.hutool.core.collection; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.*; - -/** - * CollectionStream测试方法 - */ -public class CollectionStreamTest { - @Test - public void testToIdentityMap() { - Map map = CollectionStream.toIdentityMap(null, Student::getStudentId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - List list = new ArrayList<>(); - map = CollectionStream.toIdentityMap(list, Student::getStudentId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list.add(new Student(1, 1, 1, "张三")); - list.add(new Student(1, 1, 2, "李四")); - list.add(new Student(1, 1, 3, "王五")); - map = CollectionStream.toIdentityMap(list, Student::getStudentId); - Assert.assertEquals(map.get(1L).getName(), "张三"); - Assert.assertEquals(map.get(2L).getName(), "李四"); - Assert.assertEquals(map.get(3L).getName(), "王五"); - Assert.assertEquals(map.get(4L), null); - } - - @Test - public void testToMap() { - Map map = CollectionStream.toMap(null, Student::getStudentId, Student::getName); - Assert.assertEquals(map, Collections.EMPTY_MAP); - List list = new ArrayList<>(); - map = CollectionStream.toMap(list, Student::getStudentId, Student::getName); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list.add(new Student(1, 1, 1, "张三")); - list.add(new Student(1, 1, 2, "李四")); - list.add(new Student(1, 1, 3, "王五")); - map = CollectionStream.toMap(list, Student::getStudentId, Student::getName); - Assert.assertEquals(map.get(1L), "张三"); - Assert.assertEquals(map.get(2L), "李四"); - Assert.assertEquals(map.get(3L), "王五"); - Assert.assertEquals(map.get(4L), null); - } - - @Test - public void testGroupByKey() { - Map> map = CollectionStream.groupByKey(null, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - List list = new ArrayList<>(); - map = CollectionStream.groupByKey(list, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list.add(new Student(1, 1, 1, "张三")); - list.add(new Student(1, 2, 2, "李四")); - list.add(new Student(2, 1, 1, "擎天柱")); - list.add(new Student(2, 2, 2, "威震天")); - list.add(new Student(2, 3, 2, "霸天虎")); - map = CollectionStream.groupByKey(list, Student::getClassId); - Map> compare = new HashMap<>(); - List class1 = new ArrayList<>(); - class1.add(new Student(1, 1, 1, "张三")); - class1.add(new Student(2, 1, 1, "擎天柱")); - compare.put(1L, class1); - List class2 = new ArrayList<>(); - class2.add(new Student(1, 2, 2, "李四")); - class2.add(new Student(2, 2, 2, "威震天")); - - compare.put(2L, class2); - List class3 = new ArrayList<>(); - class3.add(new Student(2, 3, 2, "霸天虎")); - compare.put(3L, class3); - Assert.assertEquals(true, map.equals(compare)); - } - - public void testGroupBy2Key() { - Map>> map = CollectionStream.groupBy2Key(null, Student::getTermId, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - List list = new ArrayList<>(); - map = CollectionStream.groupBy2Key(list, Student::getTermId, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list.add(new Student(1, 1, 1, "张三")); - list.add(new Student(1, 2, 2, "李四")); - list.add(new Student(1, 2, 3, "王五")); - list.add(new Student(2, 1, 1, "擎天柱")); - list.add(new Student(2, 2, 2, "威震天")); - list.add(new Student(2, 2, 3, "霸天虎")); - map = CollectionStream.groupBy2Key(list, Student::getTermId, Student::getClassId); - Map>> compare = new HashMap<>(); - Map> map1 = new HashMap<>(); - List list11 = new ArrayList<>(); - list11.add(new Student(1, 1, 1, "张三")); - map1.put(1L, list11); - compare.put(1L, map1); - List list12 = new ArrayList<>(); - list12.add(new Student(1, 2, 2, "李四")); - list12.add(new Student(1, 2, 3, "王五")); - map1.put(2L, list12); - compare.put(2L, map1); - Map> map2 = new HashMap<>(); - List list21 = new ArrayList<>(); - list21.add(new Student(2, 1, 1, "擎天柱")); - map2.put(1L, list21); - compare.put(2L, map2); - - List list22 = new ArrayList<>(); - list22.add(new Student(2, 2, 2, "威震天")); - list22.add(new Student(2, 2, 3, "霸天虎")); - map2.put(2L, list22); - compare.put(2L, map2); - Assert.assertEquals(true, map.equals(compare)); - } - - @Test - public void testGroup2Map() { - List list = null; - Map> map = CollectionStream.group2Map(list, Student::getTermId, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list = new ArrayList<>(); - map = CollectionStream.group2Map(list, Student::getTermId, Student::getClassId); - Assert.assertEquals(map, Collections.EMPTY_MAP); - list.add(new Student(1, 1, 1, "张三")); - list.add(new Student(1, 2, 1, "李四")); - list.add(new Student(2, 2, 1, "王五")); - map = CollectionStream.group2Map(list, Student::getTermId, Student::getClassId); - Map> compare = new HashMap<>(); - Map map1 = new HashMap<>(); - map1.put(1L, new Student(1, 1, 1, "张三")); - map1.put(2L, new Student(1, 2, 1, "李四")); - compare.put(1L, map1); - Map map2 = new HashMap<>(); - map2.put(2L, new Student(2, 2, 1, "王五")); - compare.put(2L, map2); - Assert.assertEquals(true, compare.equals(map)); - - } - - @Test - public void testTranslate2List() { - List list = CollectionStream.translate2List(null, Student::getName); - Assert.assertEquals(list, Collections.EMPTY_LIST); - List students = new ArrayList<>(); - list = CollectionStream.translate2List(students, Student::getName); - Assert.assertEquals(list, Collections.EMPTY_LIST); - students.add(new Student(1, 1, 1, "张三")); - students.add(new Student(1, 2, 2, "李四")); - students.add(new Student(2, 1, 1, "李四")); - students.add(new Student(2, 2, 2, "李四")); - students.add(new Student(2, 3, 2, "霸天虎")); - list = CollectionStream.translate2List(students, Student::getName); - List compare = new ArrayList<>(); - compare.add("张三"); - compare.add("李四"); - compare.add("李四"); - compare.add("李四"); - compare.add("霸天虎"); - Assert.assertEquals(true, list.equals(compare)); - } - - @Test - public void testTranslate2Set() { - Set set = CollectionStream.translate2Set(null, Student::getName); - Assert.assertEquals(set, Collections.EMPTY_SET); - List students = new ArrayList<>(); - set = CollectionStream.translate2Set(students, Student::getName); - Assert.assertEquals(set, Collections.EMPTY_SET); - students.add(new Student(1, 1, 1, "张三")); - students.add(new Student(1, 2, 2, "李四")); - students.add(new Student(2, 1, 1, "李四")); - students.add(new Student(2, 2, 2, "李四")); - students.add(new Student(2, 3, 2, "霸天虎")); - set = CollectionStream.translate2Set(students, Student::getName); - Set compare = new HashSet<>(); - compare.add("张三"); - compare.add("李四"); - compare.add("李四"); - compare.add("李四"); - compare.add("霸天虎"); - Assert.assertEquals(true, set.equals(compare)); - } - - @Test - public void testMerge() { - Map map1 = null; - Map map2 = Collections.EMPTY_MAP; - Map map = CollectionStream.merge(map1, map2, (s1, s2) -> s1.getName() + s2.getName()); - Assert.assertEquals(map, Collections.EMPTY_MAP); - map1 = new HashMap<>(); - map1.put(1L, new Student(1, 1, 1, "张三")); - map = CollectionStream.merge(map1, map2, this::merge); - Map temp = new HashMap<>(); - temp.put(1L, "张三"); - Assert.assertEquals(map, temp); - map2 = new HashMap<>(); - map2.put(1L, new Student(2, 1, 1, "李四")); - map = CollectionStream.merge(map1, map2, this::merge); - Map compare = new HashMap<>(); - compare.put(1L, "张三李四"); - Assert.assertEquals(true, map.equals(compare)); - } - - public String merge(Student student1, Student student2) { - if (student1 == null && student2 == null) { - return null; - } else if (student1 == null) { - return student2.getName(); - } else if (student2 == null) { - return student1.getName(); - } else { - return student1.getName() + student2.getName(); - } - } - - /** - * 班级类 - */ - public static class Student { - private long termId;//学期id - private long classId;//班级id - private long studentId;//班级id - private String name;//学生名称 - - public Student(long termId, long classId, long studentId, String name) { - this.termId = termId; - this.classId = classId; - this.studentId = studentId; - this.name = name; - } - - public long getTermId() { - return termId; - } - - public void setTermId(long termId) { - this.termId = termId; - } - - public long getClassId() { - return classId; - } - - public void setClassId(long classId) { - this.classId = classId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public long getStudentId() { - return studentId; - } - - public void setStudentId(long studentId) { - this.studentId = studentId; - } - - @Override - public boolean equals(Object obj) { - return toString().equals(obj.toString()); - } - - @Override - public String toString() { - return "Student{" + - "termId=" + termId + - ", classId=" + classId + - ", studentId=" + studentId + - ", name='" + name + '\'' + - '}'; - } - } -} \ No newline at end of file diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 3bdbc3608..d91ff3afd 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -494,11 +494,24 @@ public final class JSONUtil { } // -------------------------------------------------------------------- toBean end + /** + * 将JSONArray字符串转换为Bean的List,默认为ArrayList + * + * @param Bean类型 + * @param jsonArray JSONArray字符串 + * @param elementType List中元素类型 + * @return List + * @since 5.5.2 + */ + public static List toList(String jsonArray, Class elementType) { + return toList(parseArray(jsonArray), elementType); + } + /** * 将JSONArray转换为Bean的List,默认为ArrayList * * @param Bean类型 - * @param jsonArray JSONArray + * @param jsonArray {@link JSONArray} * @param elementType List中元素类型 * @return List * @since 4.0.7