Browse Source

enhance Console.log

Looly 5 years ago
parent
commit
c0c71a5f8f

+ 3 - 1
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修复
 

+ 158 - 51
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;
 /**
  * 命令行(控制台)工具方法类<br>
  * 此类主要针对{@link System#out} 和 {@link System#err} 做封装。
- * 
- * @author Looly
  *
+ * @author Looly
  */
 
 public class Console {
 
+	private static final String TEMPLATE_VAR = "{}";
+
 	// --------------------------------------------------------------------------------- Log
+
 	/**
 	 * 同 System.out.println()方法,打印控制台日志
 	 */
@@ -29,33 +32,120 @@ public class Console {
 	/**
 	 * 同 System.out.println()方法,打印控制台日志<br>
 	 * 如果传入打印对象为{@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.println()方法,打印控制台日志<br>
+	 * 如果传入打印对象为{@link Throwable}对象,那么同时打印堆栈
+	 *
+	 * @param otherObjs 要打印的对象
+	 * @since 5.4.3
+	 */
+	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));
 		}
 	}
 
 	/**
+	 * 同 System.out.println()方法,打印控制台日志<br>
+	 * 当传入template无"{}"时,被认为非模板,直接打印多个参数以空格分隔
+	 *
+	 * @param template 文本模板,被替换的部分用 {} 表示
+	 * @param values   值
+	 */
+	public static void log(String template, Object... 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 template 文本模板,被替换的部分用 {} 表示
+	 * @param values   值
+	 */
+	public static void log(Throwable t, String template, Object... values) {
+		out.println(StrUtil.format(template, values));
+		if (null != t) {
+			t.printStackTrace();
+			out.flush();
+		}
+	}
+
+	/**
+	 * 同 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("{}", obj);
+		print(TEMPLATE_VAR, obj);
+	}
+
+	/**
+	 * 同 System.out.println()方法,打印控制台日志<br>
+	 * 如果传入打印对象为{@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 打印长度
+	 * @param len      打印长度
 	 * @since 4.5.6
 	 */
 	public static void printProgress(char showChar, int len) {
@@ -64,10 +154,10 @@ public class Console {
 
 	/**
 	 * 打印进度条
-	 * 
+	 *
 	 * @param showChar 进度条提示字符,例如“#”
 	 * @param totalLen 总长度
-	 * @param rate 总长度所占比取值0~1
+	 * @param rate     总长度所占比取值0~1
 	 * @since 4.5.6
 	 */
 	public static void printProgress(char showChar, int totalLen, double rate) {
@@ -77,41 +167,17 @@ public class Console {
 
 	/**
 	 * 同 System.out.println()方法,打印控制台日志
-	 * 
-	 * @param template 文本模板,被替换的部分用 {} 表示
-	 * @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
+	 * @param values   值
+	 * @since 5.4.3
 	 */
-	public static void print(String template, Object... values) {
+	private static void printInternal(String template, Object... values){
 		out.print(StrUtil.format(template, values));
 	}
 
-	/**
-	 * 同 System.out.println()方法,打印控制台日志
-	 * 
-	 * @param t 异常对象
-	 * @param template 文本模板,被替换的部分用 {} 表示
-	 * @param values 值
-	 */
-	public static void log(Throwable t, String template, Object... values) {
-		out.println(StrUtil.format(template, values));
-		if (null != t) {
-			t.printStackTrace();
-			out.flush();
-		}
-	}
-
 	// --------------------------------------------------------------------------------- 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()方法,打印控制台日志<br>
+	 * 如果传入打印对象为{@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);
+	}
+
 }

+ 1 - 1
hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java

@@ -123,7 +123,7 @@ public class RandomUtil {
 	}
 
 	/**
-	 * 获得随机数[0, 2^32)
+	 * 获得随机数int值
 	 *
 	 * @return 随机数
 	 */

+ 18 - 0
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

+ 3 - 3
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<Integer, Integer> nullTypeMap = new HashMap<>();
+		final Map<Integer, Integer> 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<Integer, Integer> 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;