From 7cb8492f1871d14027ee07ec1f060075c50f3760 Mon Sep 17 00:00:00 2001 From: kongweiguang Date: Sun, 25 Jun 2023 13:59:30 +0800 Subject: [PATCH 01/18] =?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/18] =?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/18] =?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/18] =?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/18] =?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/18] 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/18] 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/18] 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/18] =?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/18] =?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/18] 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/18] 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值。 * From 1e7e9dfee24f1a0f70f6a799db7abd9c1730d1c1 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 19 Jul 2023 15:52:06 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8DUserInfo=E8=8E=B7?= =?UTF-8?q?=E5=8F=96country=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/hutool/extra/management/UserInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/management/UserInfo.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/management/UserInfo.java index 5e290f0ca..c989438cd 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/management/UserInfo.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/management/UserInfo.java @@ -41,7 +41,7 @@ public class UserInfo implements Serializable{ // JDK1.4 {@code user.country},JDK1.2 {@code user.region} String userCountry = SystemUtil.get("user.country", false); if(null == userCountry){ - userCountry = SystemUtil.get("user.country", false); + userCountry = SystemUtil.get("user.region", false); } USER_COUNTRY = userCountry; } From 6b45cfb7e2269633e31fa7b7fda88a18430181ef Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 20 Jul 2023 11:51:37 +0800 Subject: [PATCH 14/18] =?UTF-8?q?Query.of(entity)=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E4=BC=A0=E5=85=A5fields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/db/sql/Query.java | 46 +++++++++++++------ 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/Query.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/Query.java index 8b7325f35..7fca3d602 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/Query.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/Query.java @@ -12,6 +12,7 @@ package org.dromara.hutool.db.sql; +import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.db.DbRuntimeException; @@ -19,6 +20,7 @@ import org.dromara.hutool.db.Entity; import org.dromara.hutool.db.Page; import java.util.Collection; +import java.util.Set; /** * 查询对象,用于传递查询所需的字段值
@@ -26,30 +28,45 @@ import java.util.Collection; * 如果想自定义返回结果,则可在查询对象中自定义要查询的字段名,分页{@link Page}信息来自定义结果。 * * @author Looly - * */ public class Query implements Cloneable { - /** 查询的字段名列表 */ + /** + * 查询的字段名列表 + */ Collection fields; - /** 查询的表名 */ + /** + * 查询的表名 + */ String[] tableNames; - /** 查询的条件语句 */ + /** + * 查询的条件语句 + */ Condition[] where; - /** 分页对象 */ + /** + * 分页对象 + */ Page page; /** * 从{@link Entity}构建Query + * * @param where 条件查询{@link Entity},包含条件Map和表名 * @return Query * @since 5.5.3 */ - public static Query of(final Entity where){ - return new Query(SqlUtil.buildConditions(where), where.getTableName()); + public static Query of(final Entity where) { + final Query query = new Query(SqlUtil.buildConditions(where), where.getTableName()); + final Set fieldNames = where.getFieldNames(); + if (CollUtil.isNotEmpty(fieldNames)) { + query.setFields(fieldNames); + } + + return query; } // --------------------------------------------------------------- Constructor start + /** * 构造 * @@ -63,7 +80,7 @@ public class Query implements Cloneable { /** * 构造 * - * @param where 条件语句 + * @param where 条件语句 * @param tableNames 表名 */ public Query(final Condition[] where, final String... tableNames) { @@ -73,8 +90,8 @@ public class Query implements Cloneable { /** * 构造 * - * @param where 条件语句 - * @param page 分页 + * @param where 条件语句 + * @param page 分页 * @param tableNames 表名 */ public Query(final Condition[] where, final Page page, final String... tableNames) { @@ -84,10 +101,10 @@ public class Query implements Cloneable { /** * 构造 * - * @param fields 字段 + * @param fields 字段 * @param tableNames 表名 - * @param where 条件 - * @param page 分页 + * @param where 条件 + * @param page 分页 */ public Query(final Collection fields, final String[] tableNames, final Condition[] where, final Page page) { this.fields = fields; @@ -98,6 +115,7 @@ public class Query implements Cloneable { // --------------------------------------------------------------- Constructor end // --------------------------------------------------------------- Getters and Setters start + /** * 获得查询的字段名列表 * @@ -206,7 +224,7 @@ public class Query implements Cloneable { @Override public Query clone() { try { - return (Query) super.clone(); + return (Query) super.clone(); } catch (final CloneNotSupportedException e) { throw new AssertionError(); } From 7df5a80e87bbb447981c33f4bfb90b45cddca6e2 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 20 Jul 2023 23:45:29 +0800 Subject: [PATCH 15/18] add test --- .../dromara/hutool/json/IssueI7M2GZTest.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 hutool-json/src/test/java/org/dromara/hutool/json/IssueI7M2GZTest.java diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7M2GZTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7M2GZTest.java new file mode 100755 index 000000000..b3a8d0973 --- /dev/null +++ b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI7M2GZTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.json; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.dromara.hutool.core.reflect.TypeReference; +import org.dromara.hutool.json.serialize.JSONDeserializer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * https://gitee.com/dromara/hutool/issues/I7M2GZ + */ +public class IssueI7M2GZTest { + + @Data + @AllArgsConstructor + public static class JSONBeanParserImpl implements JSONDeserializer { + private String name; + private Integer parsed; + + @Override + public JSONBeanParserImpl deserialize(final JSON json) { + setName("new Object"); + setParsed(12); + return this; + } + } + + @Data + public static class MyEntity { + private List list; + } + + @Test + public void toListTest() { + final List list = new ArrayList<>(); + list.add(new JSONBeanParserImpl("Object1", 1)); + + final MyEntity entity = new MyEntity<>(); + entity.setList(list); + + final String json = JSONUtil.toJsonStr(entity); + //Console.log(json); + final MyEntity result = JSONUtil.toBean(json, new TypeReference>() {}); + Assertions.assertEquals("new Object", result.getList().get(0).getName()); + Assertions.assertNotNull(result.getList().get(0).getParsed()); + Assertions.assertEquals(Integer.valueOf(12), result.getList().get(0).getParsed()); + } +} From 04a257aec8fb07d59c8a933177281c61ca5ac2f4 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 21 Jul 2023 00:04:23 +0800 Subject: [PATCH 16/18] fix sqlLog --- .../java/org/dromara/hutool/db/DbUtil.java | 18 ++++++------ .../org/dromara/hutool/db/GlobalDbConfig.java | 8 +++--- .../org/dromara/hutool/db/sql/SqlLog.java | 28 +++++++++++++------ 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/DbUtil.java b/hutool-db/src/main/java/org/dromara/hutool/db/DbUtil.java index 90ab9ace6..9526b30f5 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/DbUtil.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/DbUtil.java @@ -24,7 +24,6 @@ import org.dromara.hutool.setting.Setting; * @author Luxiaolei */ public final class DbUtil { - private final static Log log = Log.get(); /** * 从配置文件中读取SQL打印选项,读取后会去除相应属性 @@ -34,25 +33,24 @@ public final class DbUtil { */ public static void setShowSqlGlobal(final Setting setting) { // 初始化SQL显示 - final boolean isShowSql = Convert.toBoolean(setting.remove(DSKeys.KEY_SHOW_SQL), false); - final boolean isFormatSql = Convert.toBoolean(setting.remove(DSKeys.KEY_FORMAT_SQL), false); - final boolean isShowParams = Convert.toBoolean(setting.remove(DSKeys.KEY_SHOW_PARAMS), false); + final boolean isShowSql = Convert.toBoolean(setting.remove(DSKeys.KEY_SHOW_SQL)); + final boolean isFormatSql = Convert.toBoolean(setting.remove(DSKeys.KEY_FORMAT_SQL)); + final boolean isShowParams = Convert.toBoolean(setting.remove(DSKeys.KEY_SHOW_PARAMS)); String sqlLevelStr = setting.remove(DSKeys.KEY_SQL_LEVEL); if (null != sqlLevelStr) { sqlLevelStr = sqlLevelStr.toUpperCase(); } - final Level level = Convert.toEnum(Level.class, sqlLevelStr, Level.DEBUG); - log.debug("Show sql: [{}], format sql: [{}], show params: [{}], level: [{}]", isShowSql, isFormatSql, isShowParams, level); + final Level level = Convert.toEnum(Level.class, sqlLevelStr); setShowSqlGlobal(isShowSql, isFormatSql, isShowParams, level); } /** * 设置全局配置:是否通过debug日志显示SQL * - * @param isShowSql 是否显示SQL - * @param isFormatSql 是否格式化显示的SQL - * @param isShowParams 是否打印参数 - * @param level SQL打印到的日志等级 + * @param isShowSql 是否显示SQL,{@code null}表示保持默认 + * @param isFormatSql 是否格式化显示的SQL,{@code null}表示保持默认 + * @param isShowParams 是否打印参数,{@code null}表示保持默认 + * @param level 日志级别,{@code null}表示保持默认 * @see GlobalDbConfig#setShowSql(boolean, boolean, boolean, Level) * @since 4.1.7 */ diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/GlobalDbConfig.java b/hutool-db/src/main/java/org/dromara/hutool/db/GlobalDbConfig.java index f676f8019..69ca570a2 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/GlobalDbConfig.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/GlobalDbConfig.java @@ -112,10 +112,10 @@ public class GlobalDbConfig { /** * 设置全局配置:是否通过debug日志显示SQL * - * @param isShowSql 是否显示SQL - * @param isFormatSql 是否格式化显示的SQL - * @param isShowParams 是否打印参数 - * @param level SQL打印到的日志等级 + * @param isShowSql 是否显示SQL,{@code null}表示保持默认 + * @param isFormatSql 是否格式化显示的SQL,{@code null}表示保持默认 + * @param isShowParams 是否打印参数,{@code null}表示保持默认 + * @param level 日志级别,{@code null}表示保持默认 */ public static void setShowSql(final boolean isShowSql, final boolean isFormatSql, final boolean isShowParams, final Level level) { SqlLog.INSTANCE.init(isShowSql, isFormatSql, isShowParams, level); diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlLog.java b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlLog.java index 0ddb5d22f..e79430eb9 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlLog.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/sql/SqlLog.java @@ -50,16 +50,26 @@ public class SqlLog { /** * 设置全局配置:是否通过debug日志显示SQL * - * @param isShowSql 是否显示SQL - * @param isFormatSql 是否格式化显示的SQL - * @param isShowParams 是否打印参数 - * @param level 日志级别 + * @param isShowSql 是否显示SQL,{@code null}表示保持默认 + * @param isFormatSql 是否格式化显示的SQL,{@code null}表示保持默认 + * @param isShowParams 是否打印参数,{@code null}表示保持默认 + * @param level 日志级别,{@code null}表示保持默认 */ - public void init(final boolean isShowSql, final boolean isFormatSql, final boolean isShowParams, final Level level) { - this.showSql = isShowSql; - this.formatSql = isFormatSql; - this.showParams = isShowParams; - this.level = level; + public void init(final Boolean isShowSql, final Boolean isFormatSql, final Boolean isShowParams, final Level level) { + if (null != isShowSql) { + this.showSql = isShowSql; + } + if (null != isFormatSql) { + this.formatSql = isFormatSql; + } + if (null != isShowParams) { + this.showParams = isShowParams; + } + if (null != level) { + this.level = level; + } + log.debug("Show sql: [{}], format sql: [{}], show params: [{}], level: [{}]", + this.showSql, this.formatSql, this.showParams, this.level); } /** From b146c90309b30e35abafecf6ec646116350e208d Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 21 Jul 2023 18:16:36 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8DVersionComparator?= =?UTF-8?q?=E5=AF=B91.0.3=E5=8F=8A1.0.2a=E6=AF=94=E8=BE=83=E6=9C=89?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/comparator/VersionComparator.java | 12 ++++++++++++ .../core/comparator/VersionComparatorTest.java | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java b/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java index 02fc66928..29c2bf5f1 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/comparator/VersionComparator.java @@ -12,6 +12,9 @@ package org.dromara.hutool.core.comparator; +import org.dromara.hutool.core.convert.Convert; +import org.dromara.hutool.core.regex.PatternPool; +import org.dromara.hutool.core.regex.ReUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.split.SplitUtil; import org.dromara.hutool.core.util.ObjUtil; @@ -87,6 +90,15 @@ public class VersionComparator implements Comparator, Serializable { diff = v1.length() - v2.length(); if (0 == diff) { diff = v1.compareTo(v2); + }else { + // https://gitee.com/dromara/hutool/pulls/1043 + //不同长度的先比较前面的数字;前面数字不相等时,按数字大小比较;数字相等的时候,继续按长度比较, + final int v1Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v1, 0), 0); + final int v2Num = Convert.toInt(ReUtil.get(PatternPool.NUMBERS, v2, 0), 0); + final int diff1 = v1Num - v2Num; + if (diff1 != 0) { + diff = diff1; + } } if(diff != 0) { //已有结果,结束 diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/comparator/VersionComparatorTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/comparator/VersionComparatorTest.java index 91cbb4dde..981bb4dd7 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/comparator/VersionComparatorTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/comparator/VersionComparatorTest.java @@ -53,4 +53,10 @@ public class VersionComparatorTest { final VersionComparator other = new VersionComparator(); Assertions.assertNotEquals(first, other); } + + @Test + public void versionComparatorTest7() { + final int compare = VersionComparator.INSTANCE.compare("1.12.2", "1.12.1c"); + Assertions.assertTrue(compare > 0); + } } From ba32ec43051d4ff292a8e2b823210e28de5658d4 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 21 Jul 2023 18:25:05 +0800 Subject: [PATCH 18/18] add flat --- .../dromara/hutool/core/collection/CollUtil.java | 14 ++++++++------ .../core/stream/TransformableWrappedStream.java | 1 + .../hutool/core/collection/CollUtilTest.java | 16 +++++++++------- 3 files changed, 18 insertions(+), 13 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 a189b8889..ce68556cb 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 @@ -2359,10 +2359,11 @@ public class CollUtil { * 解构多层集合 * 例如:{@code List>> 解构成 List} * + * @param 元素类型 * @param collection 需要解构的集合 * @return 解构后的集合 */ - public static List flat(Collection collection) { + public static List flat(final Collection collection) { return flat(collection, true); } @@ -2372,18 +2373,19 @@ public class CollUtil { *

* skipNull如果为true, 则解构后的集合里不包含null值,为false则会包含null值。 * + * @param 元素类型 * @param collection 需要结构的集合 * @param skipNull 是否跳过空的值 * @return 解构后的集合 */ @SuppressWarnings({"unchecked"}) - public static List flat(Collection collection, boolean skipNull) { - LinkedList queue = new LinkedList<>(collection); + public static List flat(final Collection collection, final boolean skipNull) { + final LinkedList queue = new LinkedList<>(collection); - List result = new ArrayList<>(); + final List result = new ArrayList<>(); - while (!queue.isEmpty()) { - Object t = queue.removeFirst(); + while (isNotEmpty(queue)) { + final Object t = queue.removeFirst(); if (skipNull && t == null) { continue; 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 718472d1c..3dd3656dc 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 @@ -493,6 +493,7 @@ public interface TransformableWrappedStream 函数执行后返回的List里面的类型 * @return EasyStream 一个流 + * @since 6.0.0 */ default EasyStream flat() { return EasyStream.of(CollUtil.flat(nonNull().collect(Collectors.toList()))); 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 91ee1ff88..d964791dc 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 @@ -8,7 +8,6 @@ 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 org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -1206,19 +1205,21 @@ public class CollUtilTest { } + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @Test public void flatListTest1() { - List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); + final List>> list = Arrays.asList(Arrays.asList(Arrays.asList("1", "2", "3"), Arrays.asList("5", "6", "7"))); - List objects = CollUtil.flat(list); + final List objects = CollUtil.flat(list); Assertions.assertArrayEquals(new String[]{"1", "2", "3", "5", "6", "7"}, objects.toArray()); } + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @Test public void flatListTest2() { - List>> list = Arrays.asList( + final List>> list = Arrays.asList( Arrays.asList( Arrays.asList("a"), Arrays.asList("b", "c"), @@ -1229,15 +1230,16 @@ public class CollUtilTest { Arrays.asList("j", "k", "l") ) ); - List flat = CollUtil.flat(list); + final List flat = CollUtil.flat(list); Assertions.assertArrayEquals(new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"}, flat.toArray()); } + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @Test void flatListTest3() { - List>> list = Arrays.asList( + final List>> list = Arrays.asList( Arrays.asList( Arrays.asList("a"), Arrays.asList("b", "c", null), @@ -1248,7 +1250,7 @@ public class CollUtilTest { Arrays.asList("j", "k", "l") ) ); - List flat = CollUtil.flat(list, false); + final 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()); }