From 7cb8492f1871d14027ee07ec1f060075c50f3760 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Sun, 25 Jun 2023 13:59:30 +0800 Subject: [PATCH 01/12] =?UTF-8?q?ListUtil=E6=B7=BB=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E6=9E=84list=E5=86=85=E9=83=A8=E7=9A=84=E5=A4=9A=E4=B8=AAlist?= =?UTF-8?q?=E4=B8=BA=E5=8D=95=E4=B8=AAlist=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/collection/ListUtil.java | 43 +++++++++++++++++++ .../hutool/core/collection/ListUtilTest.java | 37 ++++++++++++---- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java index ef7b37019..73af2aae7 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java @@ -27,6 +27,7 @@ import org.dromara.hutool.core.util.ObjUtil; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; /** @@ -748,4 +749,46 @@ public class ListUtil { } return resList; } + + /** + * 解构list里面的list为单个list + * + * @param list 传入的list集合 + * @param 返回的元素类型 + * @return 解构后的list集合 + */ + public static List flatList(List list) { + return flatList(list, Function.identity()); + } + + /** + * 解构list里面的list,并可以对每个元素操作 + * + * @param list 传入的list集合 + * @param operation 对每个元素进行操作 + * @param 返回的元素类型 + * @param 最内侧的元素类型 + * @return 解构后的list集合 + */ + @SuppressWarnings("all") + public static List flatList(List list, Function operation) { + List result = new ArrayList<>(); + + if (list == null || list.isEmpty()) { + return result; + } + + if (list.get(0) instanceof List) { + for (List subList : (List>) list) { + result.addAll(flatList(subList, operation)); + } + } else { + for (Object item : list) { + result.add(operation.apply((O) item)); + } + } + + return result; + } + } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java index 563a872d8..a2452fed9 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java @@ -2,6 +2,7 @@ package org.dromara.hutool.core.collection; import lombok.AllArgsConstructor; import lombok.Data; +import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.date.StopWatch; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.lang.page.PageInfo; @@ -78,7 +79,7 @@ public class ListUtilTest { @Test public void splitAvgNotZero() { - Assertions.assertThrows(IllegalArgumentException.class, ()->{ + Assertions.assertThrows(IllegalArgumentException.class, () -> { // limit不能小于等于0 ListUtil.avgPartition(Arrays.asList(1, 2, 3, 4), 0); }); @@ -122,7 +123,7 @@ public class ListUtilTest { public void pageTest2() { final List a = ListUtil.ofLinked(1, 2, 3, 4, 5); final int[] d1 = ListUtil.page(a, PageInfo.of(a.size(), 8).setFirstPageNo(0).setPageNo(0)) - .stream().mapToInt(Integer::valueOf).toArray(); + .stream().mapToInt(Integer::valueOf).toArray(); Assertions.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, d1); } @@ -170,11 +171,11 @@ public class ListUtilTest { } final List beanList = ListUtil.of( - new TestBean(2, "test2"), - new TestBean(1, "test1"), - new TestBean(5, "test5"), - new TestBean(4, "test4"), - new TestBean(3, "test3") + new TestBean(2, "test2"), + new TestBean(1, "test1"), + new TestBean(5, "test5"), + new TestBean(4, "test4"), + new TestBean(3, "test3") ); final List order = ListUtil.sortByProperty(beanList, "order"); @@ -245,13 +246,13 @@ public class ListUtilTest { } @Test - public void ofCopyOnWriteTest(){ + public void ofCopyOnWriteTest() { final CopyOnWriteArrayList strings = ListUtil.ofCopyOnWrite(ListUtil.of("a", "b")); Assertions.assertEquals(2, strings.size()); } @Test - public void ofCopyOnWriteTest2(){ + public void ofCopyOnWriteTest2() { final CopyOnWriteArrayList strings = ListUtil.ofCopyOnWrite("a", "b"); Assertions.assertEquals(2, strings.size()); } @@ -269,4 +270,22 @@ public class ListUtilTest { ListUtil.reverseNew(list); } + + @Test + public void flatListTest1() { + List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); + + List objects = ListUtil.flatList(list); + + Assertions.assertArrayEquals(new String[]{"1", "2", "3", "5", "6", "7"}, objects.toArray()); + } + + + @Test + public void flatListTest2() { + List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); + + List objects = ListUtil.flatList(list, Convert::toInt); + Assertions.assertArrayEquals(new Integer[]{1, 2, 3, 5, 6, 7}, objects.toArray()); + } } From 4e047e98e380b4897a80dd482f4099afa8c4df49 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Mon, 26 Jun 2023 13:44:55 +0800 Subject: [PATCH 02/12] =?UTF-8?q?CollUtil=E6=B7=BB=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E6=9E=84collection=E5=86=85=E9=83=A8=E7=9A=84=E5=A4=9A?= =?UTF-8?q?=E4=B8=AAcollection=E4=B8=BA=E5=8D=95=E4=B8=AAlist=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/collection/CollUtil.java | 47 ++++++- .../hutool/core/collection/ListUtil.java | 43 ------ .../hutool/core/collection/CollUtilTest.java | 124 ++++++++++++------ .../hutool/core/collection/ListUtilTest.java | 37 ++---- 4 files changed, 141 insertions(+), 110 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 39a1e444d..566da645d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -34,6 +34,7 @@ import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.reflect.TypeUtil; +import org.dromara.hutool.core.stream.EasyStream; import org.dromara.hutool.core.stream.StreamUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.split.SplitUtil; @@ -1554,7 +1555,7 @@ public class CollUtil { // String按照逗号分隔的列表对待 final String arrayStr = StrUtil.unWrap((CharSequence) value, '[', ']'); iter = SplitUtil.splitTrim(arrayStr, StrUtil.COMMA).iterator(); - } else if(value instanceof Map && BeanUtil.isWritableBean(TypeUtil.getClass(elementType))){ + } else if (value instanceof Map && BeanUtil.isWritableBean(TypeUtil.getClass(elementType))) { //https://github.com/dromara/hutool/issues/3139 // 如果值为Map,而目标为一个Bean,则Map应整体转换为Bean,而非拆分成Entry转换 iter = new ArrayIter<>(new Object[]{value}); @@ -2354,4 +2355,48 @@ public class CollUtil { } return collection.stream().allMatch(predicate); } + + /** + * 结构多层集合 + * 例如:List>> 解构成 List + * + * @param collection 需要解构的集合 + * @return 解构后的集合 + */ + public static List flat(Collection collection) { + return flat(collection, true); + } + + /** + * 结构多层集合 + * 例如:List>> 解构成 List + *

+ * skipNull的作用是当集合里面有个值为空,当为true是解构后的集合里面没有null值,如果为false则会在解构后的集合里面有努力了。 + * + * @param collection 需要结构的集合 + * @param skipNull 是否跳过空的值 + * @return 解构后的集合 + */ + @SuppressWarnings({"unchecked"}) + public static List flat(Collection collection, boolean skipNull) { + LinkedList queue = EasyStream.of(collection) + .collect(Collectors.toCollection(LinkedList::new)); + + List result = new ArrayList<>(); + + while (!queue.isEmpty()) { + Object t = queue.removeFirst(); + + if (skipNull && t == null) { + continue; + } + + if (t instanceof Collection) { + queue.addAll((Collection) t); + } else { + result.add(t); + } + } + return result; + } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java index 73af2aae7..ef7b37019 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/ListUtil.java @@ -27,7 +27,6 @@ import org.dromara.hutool.core.util.ObjUtil; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; /** @@ -749,46 +748,4 @@ public class ListUtil { } return resList; } - - /** - * 解构list里面的list为单个list - * - * @param list 传入的list集合 - * @param 返回的元素类型 - * @return 解构后的list集合 - */ - public static List flatList(List list) { - return flatList(list, Function.identity()); - } - - /** - * 解构list里面的list,并可以对每个元素操作 - * - * @param list 传入的list集合 - * @param operation 对每个元素进行操作 - * @param 返回的元素类型 - * @param 最内侧的元素类型 - * @return 解构后的list集合 - */ - @SuppressWarnings("all") - public static List flatList(List list, Function operation) { - List result = new ArrayList<>(); - - if (list == null || list.isEmpty()) { - return result; - } - - if (list.get(0) instanceof List) { - for (List subList : (List>) list) { - result.addAll(flatList(subList, operation)); - } - } else { - for (Object item : list) { - result.add(operation.apply((O) item)); - } - } - - return result; - } - } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java index 8aebcef74..676f0188c 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java @@ -3,6 +3,7 @@ package org.dromara.hutool.core.collection; import org.dromara.hutool.core.collection.iter.IterUtil; import org.dromara.hutool.core.collection.set.SetUtil; import org.dromara.hutool.core.comparator.CompareUtil; +import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.map.Dict; @@ -460,9 +461,9 @@ public class CollUtilTest { @Test public void sortByPropertyTest() { final List list = ListUtil.of( - new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // - new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // - new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// + new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // + new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // + new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// ); CollUtil.sortByProperty(list, "createTime"); @@ -474,9 +475,9 @@ public class CollUtilTest { @Test public void sortByPropertyTest2() { final List list = ListUtil.of( - new TestBean("张三", 0, DateUtil.parse("2018-05-01")), // - new TestBean("李四", -12, DateUtil.parse("2018-03-01")), // - new TestBean("王五", 23, DateUtil.parse("2018-04-01"))// + new TestBean("张三", 0, DateUtil.parse("2018-05-01")), // + new TestBean("李四", -12, DateUtil.parse("2018-03-01")), // + new TestBean("王五", 23, DateUtil.parse("2018-04-01"))// ); CollUtil.sortByProperty(list, "age"); @@ -488,8 +489,8 @@ public class CollUtilTest { @Test public void fieldValueMapTest() { final List list = ListUtil.of(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // - new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // - new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// + new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // + new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// ); final Map map = CollUtil.fieldValueMap(list, "name"); @@ -501,8 +502,8 @@ public class CollUtilTest { @Test public void fieldValueAsMapTest() { final List list = ListUtil.of(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // - new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // - new TestBean("王五", 14, DateUtil.parse("2018-04-01"))// + new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // + new TestBean("王五", 14, DateUtil.parse("2018-04-01"))// ); final Map map = CollUtil.fieldValueAsMap(list, "name", "age"); @@ -669,7 +670,7 @@ public class CollUtilTest { @Test public void subInput1PositiveNegativePositiveOutputArrayIndexOutOfBoundsException() { - Assertions.assertThrows(IndexOutOfBoundsException.class, ()->{ + Assertions.assertThrows(IndexOutOfBoundsException.class, () -> { // Arrange final List list = new ArrayList<>(); list.add(null); @@ -821,8 +822,8 @@ public class CollUtilTest { oldMap.put("c", "134"); final Map map = IterUtil.toMap(oldMap.entrySet(), - Map.Entry::getKey, - entry -> Long.parseLong(entry.getValue())); + Map.Entry::getKey, + entry -> Long.parseLong(entry.getValue())); Assertions.assertEquals(1L, (long) map.get("a")); Assertions.assertEquals(12L, (long) map.get("b")); @@ -900,12 +901,12 @@ public class CollUtilTest { public void setValueByMapTest() { // https://gitee.com/dromara/hutool/pulls/482 final List people = Arrays.asList( - new Person("aa", 12, "man", 1), - new Person("bb", 13, "woman", 2), - new Person("cc", 14, "man", 3), - new Person("dd", 15, "woman", 4), - new Person("ee", 16, "woman", 5), - new Person("ff", 17, "man", 6) + new Person("aa", 12, "man", 1), + new Person("bb", 13, "woman", 2), + new Person("cc", 14, "man", 3), + new Person("dd", 15, "woman", 4), + new Person("ee", 16, "woman", 5), + new Person("ff", 17, "man", 6) ); final Map genderMap = new HashMap<>(); @@ -946,12 +947,12 @@ public class CollUtilTest { @Test public void distinctByFunctionTest() { final List people = Arrays.asList( - new Person("aa", 12, "man", 1), - new Person("bb", 13, "woman", 2), - new Person("cc", 14, "man", 3), - new Person("dd", 15, "woman", 4), - new Person("ee", 16, "woman", 5), - new Person("ff", 17, "man", 6) + new Person("aa", 12, "man", 1), + new Person("bb", 13, "woman", 2), + new Person("cc", 14, "man", 3), + new Person("dd", 15, "woman", 4), + new Person("ee", 16, "woman", 5), + new Person("ff", 17, "man", 6) ); // 覆盖模式下ff覆盖了aa,ee覆盖了bb @@ -986,10 +987,10 @@ public class CollUtilTest { @Test public void mapBeanTest() { final List people = Arrays.asList( - new Person("aa", 12, "man", 1), - new Person("bb", 13, "woman", 2), - new Person("cc", 14, "man", 3), - new Person("dd", 15, "woman", 4) + new Person("aa", 12, "man", 1), + new Person("bb", 13, "woman", 2), + new Person("cc", 14, "man", 3), + new Person("dd", 15, "woman", 4) ); final List extract = CollUtil.map(people, Person::getName); @@ -1006,10 +1007,10 @@ public class CollUtilTest { @Test public void transTest() { final List people = Arrays.asList( - new Person("aa", 12, "man", 1), - new Person("bb", 13, "woman", 2), - new Person("cc", 14, "man", 3), - new Person("dd", 15, "woman", 4) + new Person("aa", 12, "man", 1), + new Person("bb", 13, "woman", 2), + new Person("cc", 14, "man", 3), + new Person("dd", 15, "woman", 4) ); final Collection trans = CollUtil.trans(people, Person::getName); @@ -1046,8 +1047,8 @@ public class CollUtilTest { Assertions.assertNotNull(list); Assertions.assertEquals( - ListUtil.of(1, 2, 3, 4), - CollUtil.unionAll(ListUtil.of(1), ListUtil.of(2), ListUtil.of(3), ListUtil.of(4)) + ListUtil.of(1, 2, 3, 4), + CollUtil.unionAll(ListUtil.of(1), ListUtil.of(2), ListUtil.of(3), ListUtil.of(4)) ); } @@ -1083,14 +1084,14 @@ public class CollUtilTest { Assertions.assertFalse(CollUtil.addIfAbsent(null, "123")); Assertions.assertFalse(CollUtil.addIfAbsent(ListUtil.of("123"), "123")); Assertions.assertFalse(CollUtil.addIfAbsent(ListUtil.of(new Animal("jack", 20)), - new Animal("jack", 20))); + new Animal("jack", 20))); // 正常情况 Assertions.assertTrue(CollUtil.addIfAbsent(ListUtil.of("456"), "123")); Assertions.assertTrue(CollUtil.addIfAbsent(ListUtil.of(new Animal("jack", 20)), - new Dog("jack", 20))); + new Dog("jack", 20))); Assertions.assertTrue(CollUtil.addIfAbsent(ListUtil.of(new Animal("jack", 20)), - new Animal("tom", 20))); + new Animal("tom", 20))); } @Data @@ -1181,4 +1182,51 @@ public class CollUtilTest { public void minNullTest() { Assertions.assertNull(CollUtil.max(null)); } + + + @Test + public void flatListTest1() { + List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); + + List objects = CollUtil.flat(list); + + Assertions.assertArrayEquals(new String[]{"1", "2", "3", "5", "6", "7"}, objects.toArray()); + } + + + @Test + public void flatListTest2() { + List>> list = Arrays.asList( + Arrays.asList( + Arrays.asList("a"), + Arrays.asList("b", "c"), + Arrays.asList("d", "e", "f") + ), + Arrays.asList( + Arrays.asList("g", "h", "i"), + Arrays.asList("j", "k", "l") + ) + ); + List flat = CollUtil.flat(list); + Assertions.assertArrayEquals(new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}, flat.toArray()); + + } + + + @Test + void flatListTest3() { + List>> list = Arrays.asList( + Arrays.asList( + Arrays.asList("a"), + Arrays.asList("b", "c", null), + Arrays.asList("d", "e", "f") + ), + Arrays.asList( + Arrays.asList("g", "h", "i"), + Arrays.asList("j", "k", "l") + ) + ); + List flat = CollUtil.flat(list, false); + Assertions.assertArrayEquals(new String[]{"a", "b", "c", null, "d", "e", "f", "g", "h", "i", "j", "k", "l"}, flat.toArray()); + } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java index a2452fed9..563a872d8 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/ListUtilTest.java @@ -2,7 +2,6 @@ package org.dromara.hutool.core.collection; import lombok.AllArgsConstructor; import lombok.Data; -import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.date.StopWatch; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.lang.page.PageInfo; @@ -79,7 +78,7 @@ public class ListUtilTest { @Test public void splitAvgNotZero() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { + Assertions.assertThrows(IllegalArgumentException.class, ()->{ // limit不能小于等于0 ListUtil.avgPartition(Arrays.asList(1, 2, 3, 4), 0); }); @@ -123,7 +122,7 @@ public class ListUtilTest { public void pageTest2() { final List a = ListUtil.ofLinked(1, 2, 3, 4, 5); final int[] d1 = ListUtil.page(a, PageInfo.of(a.size(), 8).setFirstPageNo(0).setPageNo(0)) - .stream().mapToInt(Integer::valueOf).toArray(); + .stream().mapToInt(Integer::valueOf).toArray(); Assertions.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, d1); } @@ -171,11 +170,11 @@ public class ListUtilTest { } final List beanList = ListUtil.of( - new TestBean(2, "test2"), - new TestBean(1, "test1"), - new TestBean(5, "test5"), - new TestBean(4, "test4"), - new TestBean(3, "test3") + new TestBean(2, "test2"), + new TestBean(1, "test1"), + new TestBean(5, "test5"), + new TestBean(4, "test4"), + new TestBean(3, "test3") ); final List order = ListUtil.sortByProperty(beanList, "order"); @@ -246,13 +245,13 @@ public class ListUtilTest { } @Test - public void ofCopyOnWriteTest() { + public void ofCopyOnWriteTest(){ final CopyOnWriteArrayList strings = ListUtil.ofCopyOnWrite(ListUtil.of("a", "b")); Assertions.assertEquals(2, strings.size()); } @Test - public void ofCopyOnWriteTest2() { + public void ofCopyOnWriteTest2(){ final CopyOnWriteArrayList strings = ListUtil.ofCopyOnWrite("a", "b"); Assertions.assertEquals(2, strings.size()); } @@ -270,22 +269,4 @@ public class ListUtilTest { ListUtil.reverseNew(list); } - - @Test - public void flatListTest1() { - List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); - - List objects = ListUtil.flatList(list); - - Assertions.assertArrayEquals(new String[]{"1", "2", "3", "5", "6", "7"}, objects.toArray()); - } - - - @Test - public void flatListTest2() { - List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); - - List objects = ListUtil.flatList(list, Convert::toInt); - Assertions.assertArrayEquals(new Integer[]{1, 2, 3, 5, 6, 7}, objects.toArray()); - } } From 9bc9dca8057bf57a04ea0818f799995764da6e3e Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Fri, 30 Jun 2023 19:09:52 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0flatObj=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/collection/CollUtil.java | 4 +-- .../stream/TransformableWrappedStream.java | 11 ++++++++ .../hutool/core/collection/CollUtilTest.java | 28 +++---------------- .../AbstractEnhancedWrappedStreamTest.java | 19 +++++++++++++ 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 566da645d..38c1b57b1 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2357,7 +2357,7 @@ public class CollUtil { } /** - * 结构多层集合 + * 解构多层集合 * 例如:List>> 解构成 List * * @param collection 需要解构的集合 @@ -2371,7 +2371,7 @@ public class CollUtil { * 结构多层集合 * 例如:List>> 解构成 List *

- * skipNull的作用是当集合里面有个值为空,当为true是解构后的集合里面没有null值,如果为false则会在解构后的集合里面有努力了。 + * skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 * * @param collection 需要结构的集合 * @param skipNull 是否跳过空的值 diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java index 5eed41ae1..3aa56e20d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java @@ -13,6 +13,7 @@ package org.dromara.hutool.core.stream; import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.collection.iter.IterUtil; import org.dromara.hutool.core.lang.Console; @@ -486,6 +487,16 @@ public interface TransformableWrappedStream childrenSetter.accept(e, null))); } + /** + * 如果当前元素是集合,则会解构当前集合 + * + * @param clazz 解构后元素的类型 + * @param 函数执行后返回的类型 + * @return EasyStream 一个流 + */ + default EasyStream flatObj(Class clazz) { + return EasyStream.of(CollUtil.flat(nonNull().collect(Collectors.toList()))).map(clazz::cast); + } // endregion // region ============ map ============ diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java index 676f0188c..8e3bab963 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/collection/CollUtilTest.java @@ -1,40 +1,19 @@ package org.dromara.hutool.core.collection; +import lombok.*; import org.dromara.hutool.core.collection.iter.IterUtil; import org.dromara.hutool.core.collection.set.SetUtil; import org.dromara.hutool.core.comparator.CompareUtil; -import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.date.DateUtil; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.map.Dict; import org.dromara.hutool.core.map.MapUtil; +import org.dromara.hutool.core.stream.EasyStream; import org.dromara.hutool.core.text.StrUtil; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.ToString; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Queue; -import java.util.Set; -import java.util.SortedSet; -import java.util.Stack; +import java.util.*; import java.util.function.Function; /** @@ -1229,4 +1208,5 @@ public class CollUtilTest { List flat = CollUtil.flat(list, false); Assertions.assertArrayEquals(new String[]{"a", "b", "c", null, "d", "e", "f", "g", "h", "i", "j", "k", "l"}, flat.toArray()); } + } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java index 60aa7b1fb..261b00dca 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java @@ -708,4 +708,23 @@ public class AbstractEnhancedWrappedStreamTest { private List children; } + + + @Test + void test() { + List>> list = Arrays.asList( + Arrays.asList( + Arrays.asList("a"), + Arrays.asList("b", "c"), + Arrays.asList("d", "e", "f") + ), + Arrays.asList( + Arrays.asList("g", "h", "i"), + Arrays.asList("j", "k", "l") + ) + ); + List r = EasyStream.of(list).flatObj(String.class).toList(); + Assertions.assertArrayEquals(new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}, r.toArray()); + } + } From ebbf0a452e47e14eb8c53d1be013702ab501f838 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Fri, 30 Jun 2023 19:20:00 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0flatObj=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index c4f465558..113b2d73a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2358,7 +2358,7 @@ public class CollUtil { /** * 解构多层集合 - * 例如:List>> 解构成 List + * 例如:List<List<List<String>>> 解构成 List<String> * * @param collection 需要解构的集合 * @return 解构后的集合 From 167dcf5d1cbcdf7f94c7bfc4de15a52317bcdf99 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Fri, 30 Jun 2023 19:21:47 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0flatObj=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/core/collection/CollUtil.java | 3 +-- .../hutool/core/stream/TransformableWrappedStream.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 113b2d73a..27d2e553c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2369,8 +2369,7 @@ public class CollUtil { /** * 结构多层集合 - * 例如:List>> 解构成 List - *

+ * 例如:List<List<List<String>>> 解构成 List<String> * skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 * * @param collection 需要结构的集合 diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java index 3aa56e20d..2843f7303 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java @@ -488,8 +488,8 @@ public interface TransformableWrappedStream 函数执行后返回的类型 * @return EasyStream 一个流 From 8e46171695d002f3483cb85e9c231a6a2ed2e7db Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Sat, 1 Jul 2023 07:27:42 +0000 Subject: [PATCH 06/12] Update hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 27d2e553c..cbd00947d 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2368,7 +2368,7 @@ public class CollUtil { } /** - * 结构多层集合 + * 解构多层集合 * 例如:List<List<List<String>>> 解构成 List<String> * skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 * From ef166b6201fdc36168124f8a9023e293030525ad Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Sat, 1 Jul 2023 07:27:57 +0000 Subject: [PATCH 07/12] Update hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index cbd00947d..9dc68c554 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2378,8 +2378,7 @@ public class CollUtil { */ @SuppressWarnings({"unchecked"}) public static List flat(Collection collection, boolean skipNull) { - LinkedList queue = EasyStream.of(collection) - .collect(Collectors.toCollection(LinkedList::new)); + LinkedList queue = new LinkedList<>(collection); List result = new ArrayList<>(); From 13fe08c73f90fa384b1ad276ce3442a0a39a3d1c Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Sat, 1 Jul 2023 08:47:26 +0000 Subject: [PATCH 08/12] Update hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java --- .../java/org/dromara/hutool/core/collection/CollUtil.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 9dc68c554..fe8e6a768 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2385,12 +2385,10 @@ public class CollUtil { while (!queue.isEmpty()) { Object t = queue.removeFirst(); - if (skipNull && t == null) { - continue; - } - if (t instanceof Collection) { queue.addAll((Collection) t); + } else if (skipNull && t == null) { + continue; } else { result.add(t); } From 844b05cc359761c2aec31cbadc88779798936ed3 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Mon, 3 Jul 2023 09:55:23 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0flat=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/hutool/core/collection/CollUtil.java | 15 +++++++++------ .../core/stream/TransformableWrappedStream.java | 11 ++++++----- .../stream/AbstractEnhancedWrappedStreamTest.java | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index fe8e6a768..387d6762e 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2363,13 +2363,14 @@ public class CollUtil { * @param collection 需要解构的集合 * @return 解构后的集合 */ - public static List flat(Collection collection) { + public static List flat(Collection collection) { return flat(collection, true); } /** * 解构多层集合 - * 例如:List<List<List<String>>> 解构成 List<String> + * 例如:例如:{@code List>> 解构成 List} + *

* skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 * * @param collection 需要结构的集合 @@ -2377,7 +2378,7 @@ public class CollUtil { * @return 解构后的集合 */ @SuppressWarnings({"unchecked"}) - public static List flat(Collection collection, boolean skipNull) { + public static List flat(Collection collection, boolean skipNull) { LinkedList queue = new LinkedList<>(collection); List result = new ArrayList<>(); @@ -2385,14 +2386,16 @@ public class CollUtil { while (!queue.isEmpty()) { Object t = queue.removeFirst(); + if (skipNull && t == null) { + continue; + } + if (t instanceof Collection) { queue.addAll((Collection) t); - } else if (skipNull && t == null) { - continue; } else { result.add(t); } } - return result; + return (List) result; } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java index 2843f7303..718472d1c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/stream/TransformableWrappedStream.java @@ -489,14 +489,15 @@ public interface TransformableWrappedStream 函数执行后返回的类型 + * 例如:{@code List>> 解构成 List} + * + * @param 函数执行后返回的List里面的类型 * @return EasyStream 一个流 */ - default EasyStream flatObj(Class clazz) { - return EasyStream.of(CollUtil.flat(nonNull().collect(Collectors.toList()))).map(clazz::cast); + default EasyStream flat() { + return EasyStream.of(CollUtil.flat(nonNull().collect(Collectors.toList()))); } + // endregion // region ============ map ============ diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java index 261b00dca..1c64f3299 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/stream/AbstractEnhancedWrappedStreamTest.java @@ -723,7 +723,7 @@ public class AbstractEnhancedWrappedStreamTest { Arrays.asList("j", "k", "l") ) ); - List r = EasyStream.of(list).flatObj(String.class).toList(); + List r = EasyStream.of(list).flat().toList(); Assertions.assertArrayEquals(new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}, r.toArray()); } From 08491be6dc6c48840f4dbc11d701ff3a8764660c Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Mon, 3 Jul 2023 13:43:40 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0flat=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 387d6762e..65db64ef9 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -34,7 +34,6 @@ import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.reflect.TypeUtil; -import org.dromara.hutool.core.stream.EasyStream; import org.dromara.hutool.core.stream.StreamUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.split.SplitUtil; From 27309d6e8282ad9e3624b8b2b81338a70cfdcb85 Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Sun, 16 Jul 2023 06:27:08 +0000 Subject: [PATCH 11/12] Update hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index 65db64ef9..e3649e7a9 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2357,7 +2357,7 @@ public class CollUtil { /** * 解构多层集合 - * 例如:List<List<List<String>>> 解构成 List<String> + * 例如:{@code List>> 解构成 List} * * @param collection 需要解构的集合 * @return 解构后的集合 From 666c65493377fc2e717857891f7e8f312570e4ca Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Sun, 16 Jul 2023 06:27:29 +0000 Subject: [PATCH 12/12] Update hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java --- .../main/java/org/dromara/hutool/core/collection/CollUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java index e3649e7a9..a189b8889 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/collection/CollUtil.java @@ -2368,7 +2368,7 @@ public class CollUtil { /** * 解构多层集合 - * 例如:例如:{@code List>> 解构成 List} + * 例如:{@code List>> 解构成 List} *

* skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 *