From 4f04bd121a4f769f28728ccbc4d41e0c742a82cc Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 20:27:33 +0800 Subject: [PATCH 1/6] =?UTF-8?q?HashMap=E5=BA=94=E6=8C=87=E5=AE=9A=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/collection/CollStreamUtil.java | 2 +- .../java/cn/hutool/core/util/NumberUtil.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java index b418ddcc1..53243cb71 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -179,7 +179,7 @@ public class CollStreamUtil { Set key = new HashSet<>(); key.addAll(map1.keySet()); key.addAll(map2.keySet()); - Map map = new HashMap<>(); + Map map = MapUtil.newHashMap(key.size()); for (K t : key) { X x = map1.get(t); Y y = map2.get(t); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 08f30132a..bedca46f8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -7,12 +7,12 @@ import cn.hutool.core.math.Calculator; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; +import java.security.SecureRandom; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Collection; import java.util.HashSet; -import java.util.Random; import java.util.Set; /** @@ -1362,8 +1362,8 @@ public class NumberUtil { throw new UtilException("Size is larger than range between begin and end!"); } - Random ran = new Random(); - Set set = new HashSet<>(); + SecureRandom ran = new SecureRandom(); + Set set = new HashSet<>(Math.max((int) (size / .75f) + 1, 16)); while (set.size() < size) { set.add(begin + ran.nextInt(end - begin)); } @@ -2159,14 +2159,14 @@ public class NumberUtil { * @since 4.0.9 */ public static BigDecimal toBigDecimal(String numberStr) { - if(StrUtil.isBlank(numberStr)){ + if (StrUtil.isBlank(numberStr)) { return BigDecimal.ZERO; } try { // 支持类似于 1,234.55 格式的数字 final Number number = parseNumber(numberStr); - if(number instanceof BigDecimal){ + if (number instanceof BigDecimal) { return (BigDecimal) number; } else { return new BigDecimal(number.toString()); @@ -2512,7 +2512,7 @@ public class NumberUtil { public static Number parseNumber(String numberStr) throws NumberFormatException { try { final NumberFormat format = NumberFormat.getInstance(); - if(format instanceof DecimalFormat){ + if (format instanceof DecimalFormat) { // issue#1818@Github // 当字符串数字超出double的长度时,会导致截断,此处使用BigDecimal接收 ((DecimalFormat) format).setParseBigDecimal(true); @@ -2699,9 +2699,9 @@ public class NumberUtil { * @since 5.7.8 */ public static double toDouble(Number value) { - if(value instanceof Float){ + if (value instanceof Float) { return Double.parseDouble(value.toString()); - }else{ + } else { return value.doubleValue(); } } From 1e7af4d7fc37dc43017234d84a203dbc10685271 Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 20:29:41 +0800 Subject: [PATCH 2/6] =?UTF-8?q?Revert=20"HashMap=E5=BA=94=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E5=88=9D=E5=A7=8B=E9=95=BF=E5=BA=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 4f04bd121a4f769f28728ccbc4d41e0c742a82cc. --- .../hutool/core/collection/CollStreamUtil.java | 2 +- .../java/cn/hutool/core/util/NumberUtil.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java index 53243cb71..b418ddcc1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -179,7 +179,7 @@ public class CollStreamUtil { Set key = new HashSet<>(); key.addAll(map1.keySet()); key.addAll(map2.keySet()); - Map map = MapUtil.newHashMap(key.size()); + Map map = new HashMap<>(); for (K t : key) { X x = map1.get(t); Y y = map2.get(t); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index bedca46f8..08f30132a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -7,12 +7,12 @@ import cn.hutool.core.math.Calculator; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; -import java.security.SecureRandom; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.Collection; import java.util.HashSet; +import java.util.Random; import java.util.Set; /** @@ -1362,8 +1362,8 @@ public class NumberUtil { throw new UtilException("Size is larger than range between begin and end!"); } - SecureRandom ran = new SecureRandom(); - Set set = new HashSet<>(Math.max((int) (size / .75f) + 1, 16)); + Random ran = new Random(); + Set set = new HashSet<>(); while (set.size() < size) { set.add(begin + ran.nextInt(end - begin)); } @@ -2159,14 +2159,14 @@ public class NumberUtil { * @since 4.0.9 */ public static BigDecimal toBigDecimal(String numberStr) { - if (StrUtil.isBlank(numberStr)) { + if(StrUtil.isBlank(numberStr)){ return BigDecimal.ZERO; } try { // 支持类似于 1,234.55 格式的数字 final Number number = parseNumber(numberStr); - if (number instanceof BigDecimal) { + if(number instanceof BigDecimal){ return (BigDecimal) number; } else { return new BigDecimal(number.toString()); @@ -2512,7 +2512,7 @@ public class NumberUtil { public static Number parseNumber(String numberStr) throws NumberFormatException { try { final NumberFormat format = NumberFormat.getInstance(); - if (format instanceof DecimalFormat) { + if(format instanceof DecimalFormat){ // issue#1818@Github // 当字符串数字超出double的长度时,会导致截断,此处使用BigDecimal接收 ((DecimalFormat) format).setParseBigDecimal(true); @@ -2699,9 +2699,9 @@ public class NumberUtil { * @since 5.7.8 */ public static double toDouble(Number value) { - if (value instanceof Float) { + if(value instanceof Float){ return Double.parseDouble(value.toString()); - } else { + }else{ return value.doubleValue(); } } From 8e0a5e20296310acf8f83677ae6cd92e07435927 Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 20:31:32 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E7=94=A8RandomUtil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/util/NumberUtil.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 08f30132a..ec92e1a21 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1362,10 +1362,9 @@ public class NumberUtil { throw new UtilException("Size is larger than range between begin and end!"); } - Random ran = new Random(); - Set set = new HashSet<>(); + Set set = new HashSet<>(Math.max((int) (size / .75f) + 1, 16)); while (set.size() < size) { - set.add(begin + ran.nextInt(end - begin)); + set.add(begin + RandomUtil.randomInt(end - begin)); } return set.toArray(new Integer[size]); From c8743914f136952fc3b974e2542db6567750591d Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 20:33:02 +0800 Subject: [PATCH 4/6] =?UTF-8?q?HashMap=E5=BA=94=E6=8C=87=E5=AE=9A=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/collection/CollStreamUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java index b418ddcc1..53243cb71 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -179,7 +179,7 @@ public class CollStreamUtil { Set key = new HashSet<>(); key.addAll(map1.keySet()); key.addAll(map2.keySet()); - Map map = new HashMap<>(); + Map map = MapUtil.newHashMap(key.size()); for (K t : key) { X x = map1.get(t); Y y = map2.get(t); From 4d9d2c4d90749aec60ec2f88e232bb887cbb02de Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 21:10:46 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CompletableFuture?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/thread/SyncUtil.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java new file mode 100644 index 000000000..5f4601b39 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncUtil.java @@ -0,0 +1,53 @@ +package cn.hutool.core.thread; + +import cn.hutool.core.exceptions.ExceptionUtil; + +import java.lang.reflect.UndeclaredThrowableException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +/** + * CompletableFuture工具类,叫CompletableFutureUtil太长 + * + * @author + * @since 2021/11/10 0010 20:55 + */ +public class SyncUtil { + + private SyncUtil() { + /* Do not new me! */ + } + + /** + * 等待所有任务执行完毕,包裹了异常 + * + * @param tasks 并行任务 + * @throws UndeclaredThrowableException 未受检异常 + */ + public static void wait(CompletableFuture... tasks) { + try { + CompletableFuture.allOf(tasks).get(); + } catch (InterruptedException | ExecutionException e) { + ExceptionUtil.wrapAndThrow(e); + } + } + + /** + * 获取异步任务结果,包裹了异常 + * + * @param task 异步任务 + * @param 任务返回值类型 + * @return 任务返回值 + * @throws RuntimeException 未受检异常 + */ + public static T get(CompletableFuture task) { + RuntimeException exception; + try { + return task.get(); + } catch (InterruptedException | ExecutionException e) { + exception = ExceptionUtil.wrapRuntime(e); + } + throw exception; + } + +} From e021f5256322f21c3cef158075f0c8dcd9841ed1 Mon Sep 17 00:00:00 2001 From: achao Date: Wed, 10 Nov 2021 21:21:01 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/thread/SyncUtilTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java new file mode 100644 index 000000000..846b4614d --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/thread/SyncUtilTest.java @@ -0,0 +1,36 @@ +package cn.hutool.core.thread; + +import cn.hutool.core.lang.Assert; +import org.junit.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +/** + * CompletableFuture工具类测试 + * + * @author + * @since 2021/11/10 0010 21:15 + */ +public class SyncUtilTest { + + @Test + public void waitAndGetTest() { + CompletableFuture hutool = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(3, TimeUnit.SECONDS); + return "hutool"; + }); + CompletableFuture sweater = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(4, TimeUnit.SECONDS); + return "卫衣"; + }); + CompletableFuture warm = CompletableFuture.supplyAsync(() -> { + ThreadUtil.sleep(5, TimeUnit.SECONDS); + return "真暖和"; + }); + // 等待完成 + SyncUtil.wait(hutool, sweater, warm); + // 获取结果 + Assert.isTrue("hutool卫衣真暖和".equals(SyncUtil.get(hutool) + SyncUtil.get(sweater) + SyncUtil.get(warm))); + } +}