ColumnValue优化

This commit is contained in:
redkale
2023-11-18 11:28:49 +08:00
parent 8f913dff0b
commit 930f0781b8
18 changed files with 262 additions and 97 deletions

View File

@@ -2,8 +2,6 @@
*/
package org.redkale.source;
import java.io.File;
import java.nio.file.Files;
import java.util.*;
import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.ResourceListener;
@@ -53,16 +51,6 @@ public abstract class AbstractCacheSource extends AbstractService implements Cac
//@since 2.7.0
public static final String CACHE_SOURCE_PIPELINES = "pipelines";
public static void main(String[] args) throws Throwable {
File file = new File("C:\\Users\\zhangjx\\Desktop\\AnonymousVirtualPoolFunction.class");
System.out.println(Utility.binToHexString(Files.readAllBytes(file.toPath())));
file = new File("C:\\Users\\zhangjx\\Desktop\\AnonymousVirtualExecutor.class");
System.out.println(Utility.binToHexString(Files.readAllBytes(file.toPath())));
}
@ResourceListener
public abstract void onResourceChange(ResourceEvent[] events);

View File

@@ -1403,7 +1403,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
@Override
public <T> DataBatch update(Class<T> clazz, Serializable pk, String column, Serializable value) {
return update(clazz, pk, ColumnValue.mov(column, value));
return update(clazz, pk, ColumnValue.set(column, value));
}
@Override
@@ -1425,7 +1425,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data
@Override
public <T> DataBatch update(Class<T> clazz, FilterNode node, String column, Serializable value) {
return update(clazz, node, (Flipper) null, ColumnValue.mov(column, value));
return update(clazz, node, (Flipper) null, ColumnValue.set(column, value));
}
@Override

View File

@@ -59,12 +59,6 @@ public final class CacheMemorySource extends AbstractCacheSource {
private final ReentrantLock containerLock = new ReentrantLock();
private final BiConsumer futureCompleteConsumer = (r, t) -> {
if (t != null) {
logger.log(Level.SEVERE, "CompletableFuture complete error", (Throwable) t);
}
};
//key: topic
private final Map<String, Set<CacheEventListener<byte[]>>> pubsubListeners = new ConcurrentHashMap<>();
@@ -574,7 +568,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
entry.cacheType = CacheEntryType.DOUBLE;
}
Long v = ((AtomicLong) entry.objectValue).addAndGet(Double.doubleToLongBits(num));
return Double.longBitsToDouble(v.intValue());
return Double.longBitsToDouble(v.longValue());
} finally {
entry.unlock();
}
@@ -631,7 +625,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
case ATOMIC:
return Utility.convertValue(type, (AtomicLong) entry.objectValue);
case DOUBLE:
return Utility.convertValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).intValue()));
return Utility.convertValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).longValue()));
case SSET:
return (T) new LinkedHashSet(entry.setValue);
case ZSET:

View File

@@ -14,9 +14,9 @@ import static org.redkale.source.ColumnExpress.*;
* String 视为 字段名 <br>
* Number 视为 数值 <br>
* 例如: UPDATE Reord SET updateTime = createTime + 10 WHERE id = 1 <br>
* source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.inc("createTime", 10))); <br>
* source.updateColumn(Record.class, 1, ColumnValue.set("updateTime", ColumnExpNode.inc("createTime", 10))); <br>
* 例如: UPDATE Reord SET updateTime = createTime * 10 / createCount WHERE id = 1 <br>
* source.updateColumn(Record.class, 1, ColumnValue.mov("updateTime", ColumnExpNode.div(ColumnExpNode.mul("createTime", 10), "createCount"))); <br>
* source.updateColumn(Record.class, 1, ColumnValue.set("updateTime", ColumnExpNode.div(ColumnExpNode.mul("createTime", 10), "createCount"))); <br>
*
* <p>
* 详情见: https://redkale.org
@@ -30,7 +30,7 @@ public class ColumnExpNode implements ColumnNode {
protected ColumnNode left;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
@ConvertColumn(index = 2)
protected ColumnExpress express; //MOVleft必须是ColumnNameNode, right必须是null
protected ColumnExpress express; //SETleft必须是ColumnNameNode, right必须是null
@ConvertColumn(index = 3)
protected ColumnNode right;//类型只能是ColumnNameNode、ColumnNumberNode、ColumnExpNode
@@ -44,9 +44,9 @@ public class ColumnExpNode implements ColumnNode {
}
ColumnNode leftNode = createColumnNode(left);
ColumnNode rightNode = createColumnNode(right);
if (express == MOV) {
if (express == SET) {
if (!(leftNode instanceof ColumnNameNode) || right != null) {
throw new IllegalArgumentException("left value must be ColumnNameNode, right value must be null on ColumnExpress.MOV");
throw new IllegalArgumentException("left value must be ColumnNameNode, right value must be null on ColumnExpress.SET");
}
}
this.left = leftNode;
@@ -73,7 +73,7 @@ public class ColumnExpNode implements ColumnNode {
}
/**
* @see org.redkale.source.ColumnNodes#mov(java.lang.String)
* @see org.redkale.source.ColumnNodes#set(java.lang.String)
*
* @param left Serializable
*
@@ -82,7 +82,7 @@ public class ColumnExpNode implements ColumnNode {
*/
@Deprecated(since = "2.8.0")
public static ColumnExpNode mov(String left) {
return new ColumnExpNode(left, MOV, null);
return new ColumnExpNode(left, SET, null);
}
/**

View File

@@ -17,7 +17,7 @@ public enum ColumnExpress {
/**
* 赋值 col = val
*/
MOV,
SET,
/**
* 加值 col = col + val
*/

View File

@@ -3,7 +3,6 @@
*/
package org.redkale.source;
import java.io.Serializable;
import static org.redkale.source.ColumnExpress.*;
/**
@@ -33,68 +32,184 @@ public abstract class ColumnNodes {
return new ColumnStringNode(value);
}
public static ColumnFuncNode func(FilterFunc func, Serializable node) {
public static ColumnFuncNode func(FilterFunc func, String column) {
return new ColumnFuncNode(func, column(column));
}
public static ColumnFuncNode func(FilterFunc func, ColumnNode node) {
return new ColumnFuncNode(func, node);
}
public static ColumnFuncNode avg(Serializable node) {
public static ColumnFuncNode avg(String column) {
return new ColumnFuncNode(FilterFunc.AVG, column(column));
}
public static ColumnFuncNode avg(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.AVG, node);
}
public static ColumnFuncNode count(Serializable node) {
public static ColumnFuncNode count(String column) {
return new ColumnFuncNode(FilterFunc.COUNT, column(column));
}
public static ColumnFuncNode count(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.COUNT, node);
}
public static ColumnFuncNode distinctCount(Serializable node) {
public static ColumnFuncNode distinctCount(String column) {
return new ColumnFuncNode(FilterFunc.DISTINCTCOUNT, column(column));
}
public static ColumnFuncNode distinctCount(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.DISTINCTCOUNT, node);
}
public static ColumnFuncNode max(Serializable node) {
public static ColumnFuncNode max(String column) {
return new ColumnFuncNode(FilterFunc.MAX, column(column));
}
public static ColumnFuncNode max(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.MAX, node);
}
public static ColumnFuncNode min(Serializable node) {
public static ColumnFuncNode min(String column) {
return new ColumnFuncNode(FilterFunc.MIN, column(column));
}
public static ColumnFuncNode min(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.MIN, node);
}
public static ColumnFuncNode sum(Serializable node) {
public static ColumnFuncNode sum(String column) {
return new ColumnFuncNode(FilterFunc.SUM, column(column));
}
public static ColumnFuncNode sum(ColumnNode node) {
return new ColumnFuncNode(FilterFunc.SUM, node);
}
public static ColumnExpNode exp(Serializable left, ColumnExpress express, Serializable right) {
public static ColumnExpNode exp(ColumnNode left, ColumnExpress express, ColumnNode right) {
return new ColumnExpNode(left, express, right);
}
public static ColumnExpNode mov(String left) {
return new ColumnExpNode(left, MOV, null);
public static ColumnExpNode set(String column) {
return new ColumnExpNode(column, SET, null);
}
public static ColumnExpNode inc(Serializable left, Serializable right) {
public static ColumnExpNode set(ColumnNameNode left) {
return new ColumnExpNode(left, SET, null);
}
public static ColumnExpNode inc(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), INC, number(rightValue));
}
public static ColumnExpNode inc(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, INC, right);
}
public static ColumnExpNode dec(Serializable left, Serializable right) {
public static ColumnExpNode inc(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, INC, column(rightColumn));
}
public static ColumnExpNode inc(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, INC, number(rightValue));
}
public static ColumnExpNode dec(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), DEC, number(rightValue));
}
public static ColumnExpNode dec(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, DEC, right);
}
public static ColumnExpNode mul(Serializable left, Serializable right) {
public static ColumnExpNode dec(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, DEC, column(rightColumn));
}
public static ColumnExpNode dec(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, DEC, number(rightValue));
}
public static ColumnExpNode mul(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), MUL, number(rightValue));
}
public static ColumnExpNode mul(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, MUL, right);
}
public static ColumnExpNode div(Serializable left, Serializable right) {
public static ColumnExpNode mul(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, MUL, column(rightColumn));
}
public static ColumnExpNode mul(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, MUL, number(rightValue));
}
public static ColumnExpNode div(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), DIV, number(rightValue));
}
public static ColumnExpNode div(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, DIV, right);
}
public static ColumnExpNode mod(Serializable left, Serializable right) {
public static ColumnExpNode div(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, DIV, column(rightColumn));
}
public static ColumnExpNode div(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, DIV, number(rightValue));
}
public static ColumnExpNode mod(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), MOD, number(rightValue));
}
public static ColumnExpNode mod(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, MOD, right);
}
public static ColumnExpNode and(Serializable left, Serializable right) {
public static ColumnExpNode mod(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, MOD, column(rightColumn));
}
public static ColumnExpNode mod(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, MOD, number(rightValue));
}
public static ColumnExpNode and(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), AND, number(rightValue));
}
public static ColumnExpNode and(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, AND, right);
}
public static ColumnExpNode orr(Serializable left, Serializable right) {
public static ColumnExpNode and(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, AND, column(rightColumn));
}
public static ColumnExpNode and(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, AND, number(rightValue));
}
public static ColumnExpNode orr(String leftColumn, Number rightValue) {
return new ColumnExpNode(column(leftColumn), ORR, number(rightValue));
}
public static ColumnExpNode orr(ColumnNode left, ColumnNode right) {
return new ColumnExpNode(left, ORR, right);
}
public static ColumnExpNode orr(ColumnNode left, String rightColumn) {
return new ColumnExpNode(left, ORR, column(rightColumn));
}
public static ColumnExpNode orr(ColumnNode left, Number rightValue) {
return new ColumnExpNode(left, ORR, number(rightValue));
}
}

View File

@@ -67,7 +67,7 @@ public class ColumnValue {
}
/**
* 同 mov 操作
* 同 set 操作
*
* @param column 字段名
* @param value 字段值
@@ -75,7 +75,21 @@ public class ColumnValue {
* @return ColumnValue
*/
public static ColumnValue create(String column, Serializable value) {
return new ColumnValue(column, MOV, value);
return new ColumnValue(column, SET, value);
}
/**
* @see #set(java.lang.String, java.io.Serializable)
*
* @param column 字段名
* @param value 字段值
*
* @return ColumnValue
* @deprecated
*/
@Deprecated(since = "2.8.0")
public static ColumnValue mov(String column, Serializable value) {
return set(column, value);
}
/**
@@ -86,8 +100,8 @@ public class ColumnValue {
*
* @return ColumnValue
*/
public static ColumnValue mov(String column, Serializable value) {
return new ColumnValue(column, MOV, value);
public static ColumnValue set(String column, Serializable value) {
return new ColumnValue(column, SET, value);
}
/**
@@ -172,10 +186,10 @@ public class ColumnValue {
*
* @return ColumnValue
*/
//不常用防止开发者容易在mov时误输入mod
// public static ColumnValue mod(String column, Serializable value) {
// return new ColumnValue(column, MOD, value);
// }
public static ColumnValue mod(String column, Serializable value) {
return new ColumnValue(column, MOD, value);
}
/**
* 返回 {column} = {column} &#38; {value} 操作
*
@@ -201,7 +215,7 @@ public class ColumnValue {
}
/**
* 同 mov 操作
* 同 set 操作
*
* @param func 字段名Lambda
* @param <T> 值的泛型
@@ -212,7 +226,7 @@ public class ColumnValue {
* @since 2.8.0
*/
public static <T extends Serializable> ColumnValue create(LambdaSupplier<T> func) {
return new ColumnValue(func, MOV);
return new ColumnValue(func, SET);
}
/**
@@ -225,8 +239,8 @@ public class ColumnValue {
*
* @since 2.8.0
*/
public static <T extends Serializable> ColumnValue mov(LambdaSupplier<T> func) {
return new ColumnValue(func, MOV);
public static <T extends Serializable> ColumnValue set(LambdaSupplier<T> func) {
return new ColumnValue(func, SET);
}
/**
@@ -285,6 +299,20 @@ public class ColumnValue {
return new ColumnValue(func, DIV);
}
/**
* 返回 {column} = {column} % {value} 操作
*
* @param func 字段名Lambda
* @param <T> 值的泛型
*
* @return ColumnValue
*
* @since 2.8.0
*/
public static <T extends Serializable> ColumnValue mod(LambdaSupplier<T> func) {
return new ColumnValue(func, MOD);
}
/**
* 返回 {column} = {column} &#38; {value} 操作
*
@@ -314,7 +342,7 @@ public class ColumnValue {
}
/**
* 同 mov 操作
* 同 set 操作
*
* @param func 字段名Lambda
* @param value 字段值
@@ -325,7 +353,7 @@ public class ColumnValue {
* @since 2.8.0
*/
public static <T> ColumnValue create(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOV, value);
return new ColumnValue(func, SET, value);
}
/**
@@ -339,8 +367,8 @@ public class ColumnValue {
*
* @since 2.8.0
*/
public static <T> ColumnValue mov(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOV, value);
public static <T> ColumnValue set(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, SET, value);
}
/**
@@ -431,6 +459,21 @@ public class ColumnValue {
return new ColumnValue(func, DIV, value);
}
/**
* 返回 {column} = {column} % {value} 操作
*
* @param func 字段名Lambda
* @param value 字段值
* @param <T> 值的泛型
*
* @return ColumnValue
*
* @since 2.8.0
*/
public static <T> ColumnValue mod(LambdaFunction<T, ?> func, Serializable value) {
return new ColumnValue(func, MOD, value);
}
/**
* 返回 {column} = {column} &#38; {value} 操作
*

View File

@@ -1015,7 +1015,7 @@ public final class EntityCache<T> {
case ORR:
numb = getNumberValue((Number) attr.get(entity), express, val instanceof ColumnNumberNode ? ((ColumnNumberNode) val).getValue() : (Number) val);
break;
case MOV:
case SET:
if (val instanceof ColumnExpNode) {
val = updateColumnExpNode(attr, entity, (ColumnExpNode) val);
}
@@ -1073,7 +1073,7 @@ public final class EntityCache<T> {
} else if (leftNode instanceof ColumnExpNode) {
leftVal = updateColumnExpNode(attr, entity, (ColumnExpNode) leftNode);
}
if (node.getExpress() == ColumnExpress.MOV) {
if (node.getExpress() == ColumnExpress.SET) {
return leftVal;
}

View File

@@ -1513,7 +1513,7 @@ public final class EntityInfo<T> {
}
//ColumnExpNode、ColumnFuncNode、ColumnNameNode、ColumnNumberNode、ColumnStringNode
ColumnNode node = cv.getValue();
//ColumnExpNode时 cv.getExpress() == ColumnExpress.MOV 只用于updateColumn
//ColumnExpNode时 cv.getExpress() == ColumnExpress.SET 只用于updateColumn
if (node instanceof ColumnExpNode) {
return formatColumnExpNodeSQLValue(attr, null, (ColumnExpNode) node, formatter);
}
@@ -1543,7 +1543,7 @@ public final class EntityInfo<T> {
return new StringBuilder().append(sqlColumn).append(" & ").append(val);
case ORR:
return new StringBuilder().append(sqlColumn).append(" | ").append(val);
case MOV:
case SET:
return val == null && isNotNullJson(attr) ? "" : val;
default:
return val;
@@ -1572,7 +1572,7 @@ public final class EntityInfo<T> {
} else if (leftNode instanceof ColumnFuncNode) {
leftVal = "(" + formatColumnFuncNodeSQLValue(attr, tabalis, (ColumnFuncNode) leftNode, formatter) + ")";
}
if (node.getExpress() == ColumnExpress.MOV) {
if (node.getExpress() == ColumnExpress.SET) {
return leftVal;
}
CharSequence rightVal = null;
@@ -1604,7 +1604,7 @@ public final class EntityInfo<T> {
case ORR:
return new StringBuilder().append(leftVal).append(" | ").append(rightVal);
}
throw new IllegalArgumentException(node + " express cannot be null or MOV");
throw new IllegalArgumentException(node + " express cannot be null or SET");
}
protected CharSequence formatColumnNameNodeSQLValue(Attribute<T, Serializable> attr, String tabalis, final ColumnNameNode node, BiFunction<EntityInfo, Object, CharSequence> formatter) {

View File

@@ -22,7 +22,9 @@ public enum FilterFunc {
SUM; //求和
public String getColumn(String col) {
if (this == DISTINCTCOUNT) return "COUNT(DISTINCT " + col + ")";
if (this == DISTINCTCOUNT) {
return "COUNT(DISTINCT " + col + ")";
}
return this.name() + "(" + col + ")";
}
}

View File

@@ -12,6 +12,7 @@ import java.util.function.*;
import org.redkale.annotation.ConstructorParameters;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ConvertDisabled;
import static org.redkale.util.Utility.isEmpty;
/**
* 该类提供类似JSONObject的数据结构主要用于读取xml配置文件和http-header存储
@@ -1631,8 +1632,7 @@ public abstract class AnyValue {
* @return 字段值
*/
public String getOrDefault(String name, String defaultValue) {
String value = getValue(name);
return value == null ? defaultValue : value;
return getValue(name, defaultValue);
}
@Override
@@ -1648,7 +1648,7 @@ public abstract class AnyValue {
}
private static <T> boolean equals(Entry<? extends T>[] entry1, Entry<T>[] entry2) {
if ((entry1 == null || entry1.length == 0) && (entry2 == null || entry2.length == 0)) {
if (isEmpty(entry1) && isEmpty(entry2)) {
return true;
}
if (entry1.length != entry2.length) {

View File

@@ -429,12 +429,13 @@ public interface Attribute<T, F> {
* 根据Class生成getter、setter方法都存在的字段对应的 Attribute 对象数组。
*
* @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类
*
* @return Attribute对象数组
*/
public static <T> Attribute<T, ?>[] create(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>();
public static <T, F> Attribute<T, F>[] create(Class<T> clazz) {
List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
@@ -476,12 +477,13 @@ public interface Attribute<T, F> {
* 根据Class生成getter方法对应的 Attribute 对象数组。
*
* @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类
*
* @return Attribute对象数组
*/
public static <T> Attribute<T, ?>[] createGetters(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>();
public static <T, F> Attribute<T, F>[] createGetters(Class<T> clazz) {
List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
@@ -519,12 +521,13 @@ public interface Attribute<T, F> {
* 根据Class生成setter方法对应的 Attribute 对象数组。
*
* @param <T> 依附类的类型
* @param <F> 字段的类型
* @param clazz 指定依附的类
*
* @return Attribute对象数组
*/
public static <T> Attribute<T, ?>[] createSetters(Class<T> clazz) {
List<Attribute<T, ?>> list = new ArrayList<>();
public static <T, F> Attribute<T, F>[] createSetters(Class<T> clazz) {
List<Attribute<T, F>> list = new ArrayList<>();
RedkaleClassLoader.putReflectionPublicFields(clazz.getName());
for (java.lang.reflect.Field field : clazz.getFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {

View File

@@ -756,10 +756,7 @@ public final class ByteArray implements ByteTuple {
* @return ByteArray
*/
public ByteArray putUnsignedMedium(int offset, int value) {
content[offset] = (byte) (value >> 16 & 0xFF);
content[offset + 1] = (byte) (value >> 8 & 0xFF);
content[offset + 2] = (byte) (value & 0xFF);
return this;
return putMedium(offset, value);
}
/**

View File

@@ -101,14 +101,14 @@ public class OneOrList<T> implements java.io.Serializable {
@Override
public OneOrList convertFrom(JsonReader in) {
if (in.isNextArray()) {
List list = (List) listDecoder.convertFrom(in);
List val = (List) listDecoder.convertFrom(in);
OneOrList rs = creator.create();
rs.setList(list);
rs.setList(val);
return rs;
} else {
Object one = oneDecoder.convertFrom(in);
Object val = oneDecoder.convertFrom(in);
OneOrList rs = creator.create();
rs.setOne(one);
rs.setOne(val);
return rs;
}
}

View File

@@ -2,11 +2,10 @@
*/
package org.redkale.util;
import org.redkale.annotation.ConstructorParameters;
import java.util.*;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.redkale.annotation.ConstructorParameters;
/**
* 详情见: https://redkale.org
@@ -71,7 +70,7 @@ public interface ResourceEvent<T> {
public static class ResourceChangeEvent<T> implements ResourceEvent<T> {
private static final Predicate<String> numRegx = Pattern.compile("^(\\-|\\+)?\\d+(\\.\\d+)?$").asPredicate();
private static final Predicate<String> numRegx = Pattern.compile("^(\\-\\+)?\\d+(\\.\\d+)?$").asPredicate();
protected String name;

View File

@@ -96,11 +96,11 @@ public class ThreadHashExecutor extends AbstractExecutorService {
}
@Override
public Future<?> submit(Runnable task) {
public Future submit(Runnable task) {
return hashExecutor(0).submit(task);
}
public Future<?> submit(int hash, Runnable task) {
public Future submit(int hash, Runnable task) {
return hashExecutor(hash).submit(task);
}

View File

@@ -119,7 +119,7 @@ public final class Utility {
private static final ReentrantLock clientLock = new ReentrantLock();
//是否native-image运行环境
private static final boolean nativeImageEnv = "executable".equals(System.getProperty("org.graalvm.nativeimage.kind"));
private static final boolean NATIVE_IMAGE_ENV = "executable".equals(System.getProperty("org.graalvm.nativeimage.kind"));
private static HttpClient httpClient;
@@ -140,7 +140,7 @@ public final class Utility {
Function<String, ExecutorService> virtualPoolFunction0 = null;
Executor virtualExecutorConsumer0 = null;
if (!nativeImageEnv) { //not native-image
if (!NATIVE_IMAGE_ENV) { //not native-image
try {
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
{ //virtualThreadLocalFunction
@@ -951,6 +951,30 @@ public final class Utility {
return collection != null && !collection.isEmpty();
}
/**
* 是否为空
*
* @param array 数组
*
* @return 是否为空
*
*/
public static <T> boolean isEmpty(T[] array) {
return array == null || array.length == 0;
}
/**
* 是否不为空
*
* @param array 数组
*
* @return 是否不为空
*
*/
public static <T> boolean isNotEmpty(T[] array) {
return array != null && array.length > 0;
}
/**
* 将字符串首字母大写
*