From c0c71a5f8f29ae461d11d4f1e643d6c2790f6de9 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 11 Sep 2020 19:16:33 +0800 Subject: [PATCH] enhance Console.log --- CHANGELOG.md | 4 +- .../java/cn/hutool/core/lang/Console.java | 235 +++++++++++++----- .../java/cn/hutool/core/util/RandomUtil.java | 2 +- .../java/cn/hutool/core/lang/ConsoleTest.java | 18 ++ .../main/java/cn/hutool/db/StatementUtil.java | 6 +- 5 files changed, 196 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 667833490..eb1cde2f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,13 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.3 (2020-09-10) +# 5.4.3 (2020-09-11) ### 新特性 * 【core 】 使用静态的of方法来new对象(pr#177@Gitee) * 【setting】 Setting增加store无参方法(issue#1072@Github) +* 【setting】 StatementUtil增加null缓存(pr#1076@Github) +* 【core 】 扩充Console功能,支持可变参数(issue#1077@Github) ### Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Console.java b/hutool-core/src/main/java/cn/hutool/core/lang/Console.java index a50f4edb2..624f8b79d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Console.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Console.java @@ -1,5 +1,6 @@ package cn.hutool.core.lang; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; @@ -11,14 +12,16 @@ import static java.lang.System.out; /** * 命令行(控制台)工具方法类
* 此类主要针对{@link System#out} 和 {@link System#err} 做封装。 - * - * @author Looly * + * @author Looly */ public class Console { + private static final String TEMPLATE_VAR = "{}"; + // --------------------------------------------------------------------------------- Log + /** * 同 System.out.println()方法,打印控制台日志 */ @@ -29,79 +32,54 @@ public class Console { /** * 同 System.out.println()方法,打印控制台日志
* 如果传入打印对象为{@link Throwable}对象,那么同时打印堆栈 - * + * * @param obj 要打印的对象 */ public static void log(Object obj) { if (obj instanceof Throwable) { - Throwable e = (Throwable) obj; + final Throwable e = (Throwable) obj; log(e, e.getMessage()); } else { - log("{}", obj); + log(TEMPLATE_VAR, obj); } } /** - * 同 System.out.print()方法,打印控制台日志 - * - * @param obj 要打印的对象 - * @since 3.3.1 + * 同 System.out.println()方法,打印控制台日志
+ * 如果传入打印对象为{@link Throwable}对象,那么同时打印堆栈 + * + * @param otherObjs 要打印的对象 + * @since 5.4.3 */ - public static void print(Object obj) { - print("{}", obj); + public static void log(Object obj1, Object... otherObjs) { + if(ArrayUtil.isEmpty(otherObjs)){ + log(obj1); + } else{ + log(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1)); + } } /** - * 打印进度条 - * - * @param showChar 进度条提示字符,例如“#” - * @param len 打印长度 - * @since 4.5.6 - */ - public static void printProgress(char showChar, int len) { - print("{}{}", CharUtil.CR, StrUtil.repeat(showChar, len)); - } - - /** - * 打印进度条 - * - * @param showChar 进度条提示字符,例如“#” - * @param totalLen 总长度 - * @param rate 总长度所占比取值0~1 - * @since 4.5.6 - */ - public static void printProgress(char showChar, int totalLen, double rate) { - Assert.isTrue(rate >= 0 && rate <= 1, "Rate must between 0 and 1 (both include)"); - printProgress(showChar, (int) (totalLen * rate)); - } - - /** - * 同 System.out.println()方法,打印控制台日志 - * + * 同 System.out.println()方法,打印控制台日志
+ * 当传入template无"{}"时,被认为非模板,直接打印多个参数以空格分隔 + * * @param template 文本模板,被替换的部分用 {} 表示 - * @param values 值 + * @param values 值 */ public static void log(String template, Object... values) { - log(null, template, values); - } - - /** - * 同 System.out.print()方法,打印控制台日志 - * - * @param template 文本模板,被替换的部分用 {} 表示 - * @param values 值 - * @since 3.3.1 - */ - public static void print(String template, Object... values) { - out.print(StrUtil.format(template, values)); + if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) { + logInternal(template, values); + } else { + logInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template)); + } } /** * 同 System.out.println()方法,打印控制台日志 - * - * @param t 异常对象 + * + * @param t 异常对象 * @param template 文本模板,被替换的部分用 {} 表示 - * @param values 值 + * @param values 值 */ public static void log(Throwable t, String template, Object... values) { out.println(StrUtil.format(template, values)); @@ -111,7 +89,95 @@ public class Console { } } + /** + * 同 System.out.println()方法,打印控制台日志 + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param values 值 + * @since 5.4.3 + */ + private static void logInternal(String template, Object... values){ + log(null, template, values); + } + + // --------------------------------------------------------------------------------- print + /** + * 同 System.out.print()方法,打印控制台日志 + * + * @param obj 要打印的对象 + * @since 3.3.1 + */ + public static void print(Object obj) { + print(TEMPLATE_VAR, obj); + } + + /** + * 同 System.out.println()方法,打印控制台日志
+ * 如果传入打印对象为{@link Throwable}对象,那么同时打印堆栈 + * + * @param otherObjs 要打印的对象 + * @since 5.4.3 + */ + public static void print(Object obj1, Object... otherObjs) { + if(ArrayUtil.isEmpty(otherObjs)){ + print(obj1); + } else{ + print(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1)); + } + } + + /** + * 同 System.out.print()方法,打印控制台日志 + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param values 值 + * @since 3.3.1 + */ + public static void print(String template, Object... values) { + if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) { + printInternal(template, values); + } else { + printInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template)); + } + } + + /** + * 打印进度条 + * + * @param showChar 进度条提示字符,例如“#” + * @param len 打印长度 + * @since 4.5.6 + */ + public static void printProgress(char showChar, int len) { + print("{}{}", CharUtil.CR, StrUtil.repeat(showChar, len)); + } + + /** + * 打印进度条 + * + * @param showChar 进度条提示字符,例如“#” + * @param totalLen 总长度 + * @param rate 总长度所占比取值0~1 + * @since 4.5.6 + */ + public static void printProgress(char showChar, int totalLen, double rate) { + Assert.isTrue(rate >= 0 && rate <= 1, "Rate must between 0 and 1 (both include)"); + printProgress(showChar, (int) (totalLen * rate)); + } + + /** + * 同 System.out.println()方法,打印控制台日志 + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param values 值 + * @since 5.4.3 + */ + private static void printInternal(String template, Object... values){ + out.print(StrUtil.format(template, values)); + } + // --------------------------------------------------------------------------------- Error + /** * 同 System.err.println()方法,打印控制台日志 */ @@ -121,7 +187,7 @@ public class Console { /** * 同 System.err.println()方法,打印控制台日志 - * + * * @param obj 要打印的对象 */ public static void error(Object obj) { @@ -129,26 +195,45 @@ public class Console { Throwable e = (Throwable) obj; error(e, e.getMessage()); } else { - error("{}", obj); + error(TEMPLATE_VAR, obj); + } + } + + /** + * 同 System.out.println()方法,打印控制台日志
+ * 如果传入打印对象为{@link Throwable}对象,那么同时打印堆栈 + * + * @param otherObjs 要打印的对象 + * @since 5.4.3 + */ + public static void error(Object obj1, Object... otherObjs) { + if(ArrayUtil.isEmpty(otherObjs)){ + error(obj1); + } else{ + error(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1)); } } /** * 同 System.err.println()方法,打印控制台日志 - * + * * @param template 文本模板,被替换的部分用 {} 表示 - * @param values 值 + * @param values 值 */ public static void error(String template, Object... values) { - error(null, template, values); + if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) { + errorInternal(template, values); + } else { + errorInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template)); + } } /** * 同 System.err.println()方法,打印控制台日志 - * - * @param t 异常对象 + * + * @param t 异常对象 * @param template 文本模板,被替换的部分用 {} 表示 - * @param values 值 + * @param values 值 */ public static void error(Throwable t, String template, Object... values) { err.println(StrUtil.format(template, values)); @@ -158,10 +243,21 @@ public class Console { } } + /** + * 同 System.err.println()方法,打印控制台日志 + * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param values 值 + */ + private static void errorInternal(String template, Object... values) { + error(null, template, values); + } + // --------------------------------------------------------------------------------- in + /** * 创建从控制台读取内容的{@link Scanner} - * + * * @return {@link Scanner} * @since 3.3.1 */ @@ -171,7 +267,7 @@ public class Console { /** * 读取用户输入的内容(在控制台敲回车前的内容) - * + * * @return 用户输入的内容 * @since 3.3.1 */ @@ -180,6 +276,7 @@ public class Console { } // --------------------------------------------------------------------------------- console lineNumber + /** * 返回当前位置+行号 (不支持Lambda、内部类、递归内使用) * @@ -193,7 +290,7 @@ public class Console { final String methodName = stackTraceElement.getMethodName(); final String fileName = stackTraceElement.getFileName(); final Integer lineNumber = stackTraceElement.getLineNumber(); - return String.format("%s.%s(%s:%s)", className,methodName,fileName,lineNumber); + return String.format("%s.%s(%s:%s)", className, methodName, fileName, lineNumber); } /** @@ -206,4 +303,14 @@ public class Console { return new Throwable().getStackTrace()[1].getLineNumber(); } + /** + * 构建空格分隔的模板,类似于"{} {} {} {}" + * + * @param count 变量数量 + * @return 模板 + */ + private static String buildTemplateSplitBySpace(int count){ + return StrUtil.repeatAndJoin(TEMPLATE_VAR, count, StrUtil.SPACE); + } + } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java index 6400dcca1..26b7d688d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java @@ -123,7 +123,7 @@ public class RandomUtil { } /** - * 获得随机数[0, 2^32) + * 获得随机数int值 * * @return 随机数 */ diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java index 491a332ef..c9a64371e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java @@ -21,6 +21,12 @@ public class ConsoleTest { Console.log("This is Console log for {}.", "test"); } + + @Test + public void logTest2(){ + Console.log("a", "b", "c"); + Console.log((Object) "a", "b", "c"); + } @Test public void printTest(){ @@ -29,6 +35,12 @@ public class ConsoleTest { Console.log("This is Console print for {}.", "test"); } + + @Test + public void printTest2(){ + Console.print("a", "b", "c"); + Console.print((Object) "a", "b", "c"); + } @Test public void errorTest(){ @@ -39,6 +51,12 @@ public class ConsoleTest { Console.error("This is Console error for {}.", "test"); } + + @Test + public void errorTest2(){ + Console.error("a", "b", "c"); + Console.error((Object) "a", "b", "c"); + } @Test @Ignore diff --git a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java index efa1b8149..1f751481b 100644 --- a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java @@ -163,9 +163,9 @@ public class StatementUtil { sql = sql.trim(); SqlLog.INSTANCE.log(sql, paramsBatch); PreparedStatement ps = conn.prepareStatement(sql); - Map nullTypeMap = new HashMap<>(); + final Map nullTypeMap = new HashMap<>(); for (Object[] params : paramsBatch) { - StatementUtil.fillParams(ps, params, nullTypeMap); + fillParams(ps, new ArrayIter<>(params), nullTypeMap); ps.addBatch(); } return ps; @@ -191,7 +191,7 @@ public class StatementUtil { //null参数的类型缓存,避免循环中重复获取类型 final Map nullTypeMap = new HashMap<>(); for (Entity entity : entities) { - StatementUtil.fillParams(ps, CollectionUtil.valuesOfKeys(entity, fields), nullTypeMap); + fillParams(ps, CollectionUtil.valuesOfKeys(entity, fields), nullTypeMap); ps.addBatch(); } return ps;