diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java index 825d9eb4..50b737ed 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/base/Kv.java @@ -7,10 +7,17 @@ import java.io.Serializable; import java.util.*; /** - * 用于统一参数配置 - * 1、有序性(适用于方法参数) - * 2、key为String类型时,忽略大小写、忽略分隔符(_、-),兼容启动命令传参 + 配置文件传参 - * 3、父级委托机制:如果存在父级,且当前实例查不到,则委托父级查找。(适用于配置优先级:启动参数 > 配置文件 > 默认值) + * 用于统一参数配置
+ *

+ * 1、有序性(适用于方法参数)
+ * 2、key为String类型时,忽略大小写、忽略分隔符(_、-),兼容启动命令传参 + 配置文件传参
+ * 3、父级委托机制:如果存在父级,且当前实例查不到,则委托父级查找。(适用于配置优先级:启动参数 > 配置文件 > 默认值)
+ *

+ * + * 使用说明:
+ * 1、take开头的方法,适用于配置层。利用parent委托机制,做优先级。 如5级配置:默认值 -> 内部配置文件 -> 环境变量 -> 外部配置文件 -> 启动参数
+ * 2、inx开头的方法,适用于不关心参数名称,根据下标取值。如普通方法参数、sql顺序参数(非具名参数)
+ * 3、get方法取值,没有委托机制,适用于sql具名参数、bean方法具名参数
* @author: aoshiguchen * @date: 2023/3/1 */ @@ -113,23 +120,6 @@ public class Kv implements Map , Serializable, Cloneable { return this.containsValue(value) || (null != parent && parent.containsValue(value)); } - @Override - public V get(Object key) { - K k = null; - try { - k = (K) key; - } catch (Exception e) { - return null; - } - if (k instanceof String) { - k = this._k.get(convertKey((String) k)); - } - if (null != k) { - return this._m.get(k); - } - return null; - } - public V stackGet(K k) { V res = get(k); if (null == res && null != parent) { @@ -233,6 +223,112 @@ public class Kv implements Map , Serializable, Cloneable { return res; } + // ====== 为了方便取值操作,get方法保持Map接口原有语义,不支持栈式取值 ======= + @Override + public V get(Object key) { + K k = null; + try { + k = (K) key; + } catch (Exception e) { + return null; + } + if (k instanceof String) { + k = this._k.get(convertKey((String) k)); + } + if (null != k) { + return this._m.get(k); + } + return null; + } + + public V get(Object key, V defaultValue) { + V res = get(key); + if (null == res) { + res = defaultValue; + } + return res; + } + + public String getStr(K k) { + return TypeUtil.conversion(get(k), String.class); + } + + public String getStr(K k, String defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), String.class); + } + + public Byte getByte(K k) { + return TypeUtil.conversion(get(k), Byte.class); + } + + public Byte getByte(K k, Byte defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Byte.class); + } + + public Character getChar(K k) { + return TypeUtil.conversion(get(k), Character.class); + } + + public Character getChar(K k, Character defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Character.class); + } + + public Boolean getBool(K k) { + return TypeUtil.conversion(get(k), Boolean.class); + } + + public Boolean getBool(K k, Boolean defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Boolean.class); + } + + public Short getShort(K k) { + return TypeUtil.conversion(get(k), Short.class); + } + + public Short getShort(K k, Short defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Short.class); + } + + public Integer getInt(K k) { + return TypeUtil.conversion(get(k), Integer.class); + } + + public Integer getInt(K k, Integer defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Integer.class); + } + + public Long getLong(K k) { + return TypeUtil.conversion(get(k), Long.class); + } + + public Long getLong(K k, Long defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Long.class); + } + + public Float getFloat(K k) { + return TypeUtil.conversion(get(k), Float.class); + } + + public Float getFloat(K k, Float defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Float.class); + } + + public Double getDouble(K k) { + return TypeUtil.conversion(get(k), Double.class); + } + + public Double getDouble(K k, Double defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Double.class); + } + + public Date getDate(K k) { + return TypeUtil.conversion(get(k), Date.class); + } + + public Date getDate(K k, Date defaultValue) { + return TypeUtil.conversion(get(k, (V)defaultValue), Date.class); + } + // ====== 为了方便取值操作,take开头的方法,全部基于栈式取值 ======= public V take(K k) { return this.stackGet(k); @@ -321,4 +417,100 @@ public class Kv implements Map , Serializable, Cloneable { public Date takeDate(K k, Date defaultValue) { return TypeUtil.conversion(take(k, (V)defaultValue), Date.class); } + + // ====== 为了方便取值操作,idx开头的方法,全部基于下标取值 ======= + public V idx(int i) { + if (i >= 0 && i < this.size()) { + return (V)this._m.values().toArray(new Object[]{})[i]; + } + return null; + } + + public V idx(int i, V defaultValue) { + V res = idx(i); + if (null == res) { + res = defaultValue; + } + return defaultValue; + } + + public String idxStr(int i) { + return TypeUtil.conversion(idx(i), String.class); + } + + public String idxStr(int i, String defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), String.class); + } + + public Byte idxByte(int i) { + return TypeUtil.conversion(idx(i), Byte.class); + } + + public Byte idxByte(int i, Byte defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Byte.class); + } + + public Character idxChar(int i) { + return TypeUtil.conversion(idx(i), Character.class); + } + + public Character idxChar(int i, Character defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Character.class); + } + + public Boolean idxBool(int i) { + return TypeUtil.conversion(idx(i), Boolean.class); + } + + public Boolean idxBool(int i, Boolean defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Boolean.class); + } + + public Short idxShort(int i) { + return TypeUtil.conversion(idx(i), Short.class); + } + + public Short idxShort(int i, Short defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Short.class); + } + + public Integer idxInt(int i) { + return TypeUtil.conversion(idx(i), Integer.class); + } + + public Integer idxInt(int i, Integer defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Integer.class); + } + + public Long idxLong(int i) { + return TypeUtil.conversion(idx(i), Long.class); + } + + public Long idxLong(int i, Long defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Long.class); + } + + public Float idxFloat(int i) { + return TypeUtil.conversion(idx(i), Float.class); + } + + public Float idxFloat(int i, Float defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Float.class); + } + + public Double idxDouble(int i) { + return TypeUtil.conversion(idx(i), Double.class); + } + + public Double idxDouble(int i, Double defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Double.class); + } + + public Date idxDate(int i) { + return TypeUtil.conversion(idx(i), Date.class); + } + + public Date idxDate(int i, Date defaultValue) { + return TypeUtil.conversion(idx(i, (V)defaultValue), Date.class); + } } diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java index 96998051..ec693085 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/base/KvTest.java @@ -28,8 +28,10 @@ public class KvTest { Assert.assertTrue(kv1.stackSize() == 2); Assert.assertTrue(kv1.get("app.server.http.http-port").equals(8080)); Assert.assertTrue(kv1.get("app.server.http.httpPort").equals(8080)); + Assert.assertTrue(kv1.idx(0).equals(8080)); Assert.assertTrue(kv1.get("app.server.http.jks_Path").equals("/123/456")); Assert.assertTrue(kv1.get("app.server.http.jksPath").equals("/123/456")); + Assert.assertTrue(kv1.idx(1).equals("/123/456")); Assert.assertTrue(!kv2.isEmpty()); Assert.assertTrue(kv2.size() == 2);