优化AnyValue.toString

This commit is contained in:
Redkale
2022-12-08 23:15:44 +08:00
parent 8e55ddfcae
commit 8a630ff007

View File

@@ -31,9 +31,13 @@ public abstract class AnyValue {
* merge两节点是否覆盖的判断函数 * merge两节点是否覆盖的判断函数
* *
*/ */
public static interface MergeReplacePredicate { public static interface MergeFunction {
public boolean test(String name, AnyValue val1, AnyValue val2); public static final int REPLACE = 1;
public static final int MERGE = 2;
public int apply(String name, AnyValue val1, AnyValue val2);
} }
/** /**
@@ -177,12 +181,12 @@ public abstract class AnyValue {
* 将另一个对象合并过来 * 将另一个对象合并过来
* *
* @param node0 代合并对象 * @param node0 代合并对象
* @param predicate 判断是否覆盖的函数 * @param func 判断覆盖方式的函数
* *
* @return AnyValue * @return AnyValue
*/ */
@Override @Override
public DefaultAnyValue merge(AnyValue node0, MergeReplacePredicate predicate) { public DefaultAnyValue merge(AnyValue node0, MergeFunction func) {
if (node0 == null) return this; if (node0 == null) return this;
if (node0 == this) throw new IllegalArgumentException(); if (node0 == this) throw new IllegalArgumentException();
DefaultAnyValue node = (DefaultAnyValue) node0; DefaultAnyValue node = (DefaultAnyValue) node0;
@@ -194,19 +198,30 @@ public abstract class AnyValue {
} }
if (node.anyEntrys != null) { if (node.anyEntrys != null) {
for (Entry<DefaultAnyValue> en : node.anyEntrys) { for (Entry<DefaultAnyValue> en : node.anyEntrys) {
if (en == null) continue; if (en == null || en.value == null) continue;
AnyValue[] ns = getAnyValues(en.name); Entry<AnyValue>[] ns = getAnyValueEntrys(en.name);
if (ns == null || ns.length < 1) { if (ns == null || ns.length < 1) {
addValue(en.name, en.value); addValue(en.name, en.value);
} else { } else {
boolean ok = false; boolean ok = false;
for (AnyValue item : ns) { for (Entry<AnyValue> item : ns) {
if (item == null) continue; if (item == null) continue;
if (en.value.parentArrayIndex == ((DefaultAnyValue) item).parentArrayIndex) { if (item.value != null && en.value.parentArrayIndex == ((DefaultAnyValue) item.value).parentArrayIndex) {
if (predicate == null || predicate.test(en.name, en.value, item)) { if (func == null) {
item.merge(en.value, predicate); item.value.merge(en.value, func);
ok = true; ok = true;
break; break;
} else {
int funcVal = func.apply(en.name, en.value, item.value);
if (funcVal == MergeFunction.MERGE) {
item.value.merge(en.value, func);
ok = true;
break;
} else if (funcVal == MergeFunction.REPLACE) {
item.value = en.value.copy();
ok = true;
break;
}
} }
} }
} }
@@ -375,22 +390,26 @@ public abstract class AnyValue {
@Override @Override
public String[] getValues(String... names) { public String[] getValues(String... names) {
return Entry.getStringValues(this.predicate, this.stringEntrys, names); return Entry.getStringArray(this.predicate, this.stringEntrys, names);
} }
@Override @Override
public AnyValue[] getAnyValues(String... names) { public AnyValue[] getAnyValues(String... names) {
return Entry.getAnyValueValues(this.predicate, this.anyEntrys, names); return Entry.getAnyValueArray(this.predicate, this.anyEntrys, names);
} }
@Override @Override
public String[] getValues(String name) { public String[] getValues(String name) {
return Entry.getStringValues(this.predicate, this.stringEntrys, name); return Entry.getStringArray(this.predicate, this.stringEntrys, name);
} }
@Override @Override
public AnyValue[] getAnyValues(String name) { public AnyValue[] getAnyValues(String name) {
return Entry.getAnyValueValues(this.predicate, this.anyEntrys, name); return Entry.getAnyValueArray(this.predicate, this.anyEntrys, name);
}
protected Entry<AnyValue>[] getAnyValueEntrys(String name) {
return Entry.getEntryAnyValueArray(this.predicate, this.anyEntrys, name);
} }
@Override @Override
@@ -555,7 +574,25 @@ public abstract class AnyValue {
return value; return value;
} }
static String[] getStringValues(BiPredicate<String, String> comparison, Entry<String>[] entitys, String name) { static Entry<AnyValue>[] getEntryAnyValueArray(BiPredicate<String, String> comparison, Entry<DefaultAnyValue>[] entitys, String name) {
int len = 0;
for (Entry en : entitys) {
if (comparison.test(en.name, name)) {
++len;
}
}
if (len == 0) return new Entry[len];
Entry[] rs = new Entry[len];
int i = 0;
for (Entry<DefaultAnyValue> en : entitys) {
if (comparison.test(en.name, name)) {
rs[i++] = en;
}
}
return rs;
}
static String[] getStringArray(BiPredicate<String, String> comparison, Entry<String>[] entitys, String name) {
int len = 0; int len = 0;
for (Entry en : entitys) { for (Entry en : entitys) {
if (comparison.test(en.name, name)) { if (comparison.test(en.name, name)) {
@@ -573,7 +610,7 @@ public abstract class AnyValue {
return rs; return rs;
} }
static AnyValue[] getAnyValueValues(BiPredicate<String, String> comparison, Entry<DefaultAnyValue>[] entitys, String name) { static AnyValue[] getAnyValueArray(BiPredicate<String, String> comparison, Entry<DefaultAnyValue>[] entitys, String name) {
int len = 0; int len = 0;
for (Entry en : entitys) { for (Entry en : entitys) {
if (comparison.test(en.name, name)) { if (comparison.test(en.name, name)) {
@@ -591,7 +628,7 @@ public abstract class AnyValue {
return rs; return rs;
} }
static String[] getStringValues(BiPredicate<String, String> comparison, Entry<String>[] entitys, String... names) { static String[] getStringArray(BiPredicate<String, String> comparison, Entry<String>[] entitys, String... names) {
int len = 0; int len = 0;
for (Entry en : entitys) { for (Entry en : entitys) {
for (String name : names) { for (String name : names) {
@@ -615,7 +652,7 @@ public abstract class AnyValue {
return rs; return rs;
} }
static AnyValue[] getAnyValueValues(BiPredicate<String, String> comparison, Entry<DefaultAnyValue>[] entitys, String... names) { static AnyValue[] getAnyValueArray(BiPredicate<String, String> comparison, Entry<DefaultAnyValue>[] entitys, String... names) {
int len = 0; int len = 0;
for (Entry en : entitys) { for (Entry en : entitys) {
for (String name : names) { for (String name : names) {
@@ -961,6 +998,7 @@ public abstract class AnyValue {
Entry<AnyValue>[] anyArray = getAnyEntrys(); Entry<AnyValue>[] anyArray = getAnyEntrys();
int size = (stringArray == null ? 0 : stringArray.length) + (anyArray == null ? 0 : anyArray.length); int size = (stringArray == null ? 0 : stringArray.length) + (anyArray == null ? 0 : anyArray.length);
int index = 0; int index = 0;
if (stringArray != null) {
for (Entry<String> en : stringArray) { for (Entry<String> en : stringArray) {
if (en.value == null) { if (en.value == null) {
sb.append(space).append(" '").append(en.name).append("': null"); sb.append(space).append(" '").append(en.name).append("': null");
@@ -973,6 +1011,8 @@ public abstract class AnyValue {
sb.append(",\r\n"); sb.append(",\r\n");
} }
} }
}
if (anyArray != null) {
for (Entry<AnyValue> en : anyArray) { for (Entry<AnyValue> en : anyArray) {
sb.append(space).append(" '").append(en.name).append("': ").append(en.value.toString(indent + 4, prefixFunc)); sb.append(space).append(" '").append(en.name).append("': ").append(en.value.toString(indent + 4, prefixFunc));
if (++index >= size) { if (++index >= size) {
@@ -981,6 +1021,7 @@ public abstract class AnyValue {
sb.append(",\r\n"); sb.append(",\r\n");
} }
} }
}
sb.append(space).append('}'); sb.append(space).append('}');
return sb.toString(); return sb.toString();
} }
@@ -1007,11 +1048,11 @@ public abstract class AnyValue {
* 将另一个对象合并过来 * 将另一个对象合并过来
* *
* @param node 代合并对象 * @param node 代合并对象
* @param predicate 判断是否覆盖的函数 * @param func 判断覆盖方式的函数
* *
* @return AnyValue * @return AnyValue
*/ */
public abstract AnyValue merge(AnyValue node, MergeReplacePredicate predicate); public abstract AnyValue merge(AnyValue node, MergeFunction func);
/** /**
* 回调子节点 * 回调子节点