This commit is contained in:
Looly 2021-04-11 01:26:36 +08:00
parent 155dce6f3a
commit 3a105e0334
15 changed files with 443 additions and 302 deletions

View File

@ -20,6 +20,8 @@
* 【http 】 HttpRequest支持307、308状态码识别issue#1504@Github
* 【core 】 CharUtil.isBlankChar增加\u0000判断pr#1505@Github
* 【extra 】 添加Houbb Pinyin支持pr#1506@Github
* 【core 】 添加LambdaUtilpr#295@Gitee
* 【core 】 添加StrPool和CharPool
### Bug修复
* 【core 】 修复Validator.isUrl()传空返回trueissue#I3ETTY@Gitee

View File

@ -21,6 +21,7 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.TypeUtil;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.AbstractCollection;
import java.util.ArrayList;
@ -2916,7 +2917,7 @@ public class CollUtil {
* @author Looly
*/
@FunctionalInterface
public interface Consumer<T> {
public interface Consumer<T> extends Serializable {
/**
* 接受并处理一个参数
*
@ -2934,7 +2935,7 @@ public class CollUtil {
* @author Looly
*/
@FunctionalInterface
public interface KVConsumer<K, V> {
public interface KVConsumer<K, V> extends Serializable{
/**
* 接受并处理一对参数
*

View File

@ -1,11 +1,13 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @param <P> 参数类型
@ -13,10 +15,10 @@ package cn.hutool.core.lang.func;
* @since 3.1.0
*/
@FunctionalInterface
public interface Func<P, R> {
public interface Func<P, R> extends Serializable {
/**
* 执行函数
*
*
* @param parameters 参数列表
* @return 函数执行结果
* @throws Exception 自定义异常

View File

@ -1,21 +1,23 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 无参数的函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @param <R> 返回值类型
* @since 4.5.2
*/
@FunctionalInterface
public interface Func0<R> {
public interface Func0<R> extends Serializable {
/**
* 执行函数
*
*
* @return 函数执行结果
* @throws Exception 自定义异常
*/

View File

@ -1,11 +1,13 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 只有一个参数的函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @param <P> 参数类型
@ -13,11 +15,11 @@ package cn.hutool.core.lang.func;
* @since 4.2.2
*/
@FunctionalInterface
public interface Func1<P, R> {
public interface Func1<P, R> extends Serializable {
/**
* 执行函数
*
*
* @param parameter 参数
* @return 函数执行结果
* @throws Exception 自定义异常

View File

@ -0,0 +1,52 @@
package cn.hutool.core.lang.func;
import cn.hutool.core.lang.SimpleCache;
import cn.hutool.core.util.ReflectUtil;
import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
/**
* Lambda相关工具类
*
* @author looly, Scen
* @since 5.6.3
*/
public class LambdaUtil {
private static final SimpleCache<String, SerializedLambda> cache = new SimpleCache<>();
/**
* 解析lambda表达式,加了缓存
* 该缓存可能会在任意不定的时间被清除
*
* @param <T> Lambda类型
* @param func 需要解析的 lambda 对象无参方法
* @return 返回解析后的结果
*/
public static <T> SerializedLambda resolve(Func1<T, ?> func) {
return _resolve(func);
}
/**
* 获取lambda表达式函数方法名称
*
* @param <T> Lambda类型
* @param func 函数无参方法
* @return 函数名称
*/
public static <T> String getMethodName(Func1<T, ?> func) {
return resolve(func).getImplMethodName();
}
/**
* 解析lambda表达式,加了缓存
* 该缓存可能会在任意不定的时间被清除
*
* @param func 需要解析的 lambda 对象
* @return 返回解析后的结果
*/
private static <T> SerializedLambda _resolve(Serializable func) {
return cache.get(func.getClass().getName(), () -> ReflectUtil.invoke(func, "writeReplace"));
}
}

View File

@ -1,22 +1,24 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @param <P> 参数类型
* @since 3.1.0
*/
@FunctionalInterface
public interface VoidFunc<P> {
public interface VoidFunc<P> extends Serializable {
/**
* 执行函数
*
*
* @param parameters 参数列表
* @throws Exception 自定义异常
*/

View File

@ -1,21 +1,23 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @since 3.2.3
*/
@FunctionalInterface
public interface VoidFunc0 {
public interface VoidFunc0 extends Serializable {
/**
* 执行函数
*
*
* @throws Exception 自定义异常
*/
void call() throws Exception;

View File

@ -1,21 +1,23 @@
package cn.hutool.core.lang.func;
import java.io.Serializable;
/**
* 函数对象<br>
* 接口灵感来自于<a href="http://actframework.org/">ActFramework</a><br>
* 一个函数接口代表一个一个函数用于包装一个函数为对象<br>
* 在JDK8之前Java的函数并不能作为参数传递也不能作为返回值存在此接口用于将一个函数包装成为一个对象从而传递对象
*
*
* @author Looly
*
* @since 3.2.3
*/
@FunctionalInterface
public interface VoidFunc1<P> {
public interface VoidFunc1<P> extends Serializable {
/**
* 执行函数
*
*
* @param parameter 参数
* @throws Exception 自定义异常
*/

View File

@ -0,0 +1,86 @@
package cn.hutool.core.text;
/**
* 常用字符常量
*
* @author looly
* @since 5.6.3
*/
public interface CharPool {
/**
* 字符常量空格符 {@code ' '}
*/
char SPACE = ' ';
/**
* 字符常量制表符 {@code '\t'}
*/
char TAB = ' ';
/**
* 字符常量 {@code '.'}
*/
char DOT = '.';
/**
* 字符常量斜杠 {@code '/'}
*/
char SLASH = '/';
/**
* 字符常量反斜杠 {@code '\\'}
*/
char BACKSLASH = '\\';
/**
* 字符常量回车符 {@code '\r'}
*/
char CR = '\r';
/**
* 字符常量换行符 {@code '\n'}
*/
char LF = '\n';
/**
* 字符常量减号连接符 {@code '-'}
*/
char DASHED = '-';
/**
* 字符常量下划线 {@code '_'}
*/
char UNDERLINE = '_';
/**
* 字符常量逗号 {@code ','}
*/
char COMMA = ',';
/**
* 字符常量花括号 <code>'{'</code>
*/
char DELIM_START = '{';
/**
* 字符常量花括号 <code>'}'</code>
*/
char DELIM_END = '}';
/**
* 字符常量中括号 {@code '['}
*/
char BRACKET_START = '[';
/**
* 字符常量中括号 {@code ']'}
*/
char BRACKET_END = ']';
/**
* 字符常量双引号 {@code '"'}
*/
char DOUBLE_QUOTES = '"';
/**
* 字符常量单引号 {@code '\''}
*/
char SINGLE_QUOTE = '\'';
/**
* 字符常量 {@code '&'}
*/
char AMP = '&';
/**
* 字符常量冒号 {@code ':'}
*/
char COLON = ':';
/**
* 字符常量艾特 {@code '@'}
*/
char AT = '@';
}

View File

@ -0,0 +1,211 @@
package cn.hutool.core.text;
import cn.hutool.core.util.XmlUtil;
/**
* 常用字符串常量定义
*
* @author looly
* @since 5.6.3
*/
public interface StrPool {
/**
* 字符常量空格符 {@code ' '}
*/
char C_SPACE = CharPool.SPACE;
/**
* 字符常量制表符 {@code '\t'}
*/
char C_TAB = CharPool.TAB;
/**
* 字符常量 {@code '.'}
*/
char C_DOT = CharPool.DOT;
/**
* 字符常量斜杠 {@code '/'}
*/
char C_SLASH = CharPool.SLASH;
/**
* 字符常量反斜杠 {@code '\\'}
*/
char C_BACKSLASH = CharPool.BACKSLASH;
/**
* 字符常量回车符 {@code '\r'}
*/
char C_CR = CharPool.CR;
/**
* 字符常量换行符 {@code '\n'}
*/
char C_LF = CharPool.LF;
/**
* 字符常量下划线 {@code '_'}
*/
char C_UNDERLINE = CharPool.UNDERLINE;
/**
* 字符常量逗号 {@code ','}
*/
char C_COMMA = CharPool.COMMA;
/**
* 字符常量花括号 <code>'{'</code>
*/
char C_DELIM_START = CharPool.DELIM_START;
/**
* 字符常量花括号 <code>'}'</code>
*/
char C_DELIM_END = CharPool.DELIM_END;
/**
* 字符常量中括号 {@code '['}
*/
char C_BRACKET_START = CharPool.BRACKET_START;
/**
* 字符常量中括号 {@code ']'}
*/
char C_BRACKET_END = CharPool.BRACKET_END;
/**
* 字符常量冒号 {@code ':'}
*/
char C_COLON = CharPool.COLON;
/**
* 字符常量艾特 {@code '@'}
*/
char C_AT = CharPool.AT;
/**
* 字符串常量制表符 {@code "\t"}
*/
String TAB = " ";
/**
* 字符串常量 {@code "."}
*/
String DOT = ".";
/**
* 字符串常量双点 {@code ".."} <br>
* 用途作为指向上级文件夹的路径{@code "../path"}
*/
String DOUBLE_DOT = "..";
/**
* 字符串常量斜杠 {@code "/"}
*/
String SLASH = "/";
/**
* 字符串常量反斜杠 {@code "\\"}
*/
String BACKSLASH = "\\";
/**
* 字符串常量回车符 {@code "\r"} <br>
* 解释该字符常用于表示 Linux 系统和 MacOS 系统下的文本换行
*/
String CR = "\r";
/**
* 字符串常量换行符 {@code "\n"}
*/
String LF = "\n";
/**
* 字符串常量Windows 换行 {@code "\r\n"} <br>
* 解释该字符串常用于表示 Windows 系统下的文本换行
*/
String CRLF = "\r\n";
/**
* 字符串常量下划线 {@code "_"}
*/
String UNDERLINE = "_";
/**
* 字符串常量减号连接符 {@code "-"}
*/
String DASHED = "-";
/**
* 字符串常量逗号 {@code ","}
*/
String COMMA = ",";
/**
* 字符串常量花括号 <code>"{"</code>
*/
String DELIM_START = "{";
/**
* 字符串常量花括号 <code>"}"</code>
*/
String DELIM_END = "}";
/**
* 字符串常量中括号 {@code "["}
*/
String BRACKET_START = "[";
/**
* 字符串常量中括号 {@code "]"}
*/
String BRACKET_END = "]";
/**
* 字符串常量冒号 {@code ":"}
*/
String COLON = ":";
/**
* 字符串常量艾特 {@code "@"}
*/
String AT = "@";
/**
* 字符串常量HTML 空格转义 {@code "&nbsp;" -> " "}
*/
String HTML_NBSP = XmlUtil.NBSP;
/**
* 字符串常量HTML And 符转义 {@code "&amp;" -> "&"}
*/
String HTML_AMP = XmlUtil.AMP;
/**
* 字符串常量HTML 双引号转义 {@code "&quot;" -> "\""}
*/
String HTML_QUOTE = XmlUtil.QUOTE;
/**
* 字符串常量HTML 单引号转义 {@code "&apos" -> "'"}
*/
String HTML_APOS = XmlUtil.APOS;
/**
* 字符串常量HTML 小于号转义 {@code "&lt;" -> "<"}
*/
String HTML_LT = XmlUtil.LT;
/**
* 字符串常量HTML 大于号转义 {@code "&gt;" -> ">"}
*/
String HTML_GT = XmlUtil.GT;
/**
* 字符串常量 JSON {@code "{}"}
*/
String EMPTY_JSON = "{}";
}

View File

@ -1,6 +1,7 @@
package cn.hutool.core.util;
import cn.hutool.core.text.ASCIIStrCache;
import cn.hutool.core.text.CharPool;
/**
* 字符工具类<br>
@ -9,84 +10,7 @@ import cn.hutool.core.text.ASCIIStrCache;
* @author looly
* @since 4.0.1
*/
public class CharUtil {
/**
* 字符常量空格符 {@code ' '}
*/
public static final char SPACE = ' ';
/**
* 字符常量制表符 {@code '\t'}
*/
public static final char TAB = ' ';
/**
* 字符常量 {@code '.'}
*/
public static final char DOT = '.';
/**
* 字符常量斜杠 {@code '/'}
*/
public static final char SLASH = '/';
/**
* 字符常量反斜杠 {@code '\\'}
*/
public static final char BACKSLASH = '\\';
/**
* 字符常量回车符 {@code '\r'}
*/
public static final char CR = '\r';
/**
* 字符常量换行符 {@code '\n'}
*/
public static final char LF = '\n';
/**
* 字符常量减号连接符 {@code '-'}
*/
public static final char DASHED = '-';
/**
* 字符常量下划线 {@code '_'}
*/
public static final char UNDERLINE = '_';
/**
* 字符常量逗号 {@code ','}
*/
public static final char COMMA = ',';
/**
* 字符常量花括号 <code>'{'</code>
*/
public static final char DELIM_START = '{';
/**
* 字符常量花括号 <code>'}'</code>
*/
public static final char DELIM_END = '}';
/**
* 字符常量中括号 {@code '['}
*/
public static final char BRACKET_START = '[';
/**
* 字符常量中括号 {@code ']'}
*/
public static final char BRACKET_END = ']';
/**
* 字符常量双引号 {@code '"'}
*/
public static final char DOUBLE_QUOTES = '"';
/**
* 字符常量单引号 {@code '\''}
*/
public static final char SINGLE_QUOTE = '\'';
/**
* 字符常量 {@code '&'}
*/
public static final char AMP = '&';
/**
* 字符常量冒号 {@code ':'}
*/
public static final char COLON = ':';
/**
* 字符常量艾特 {@code '@'}
*/
public static final char AT = '@';
public class CharUtil implements CharPool {
/**
* 是否为ASCII字符ASCII字符位于0~127之间

View File

@ -193,6 +193,39 @@ public class ModifierUtil {
return hasModifier(clazz, ModifierType.STATIC);
}
/**
* 是否是合成字段由java编译器生成的
*
* @param field 字段
* @return 是否是合成字段
* @since 5.6.3
*/
public static boolean isSynthetic(Field field) {
return field.isSynthetic();
}
/**
* 是否是合成方法由java编译器生成的
*
* @param method 方法
* @return 是否是合成方法
* @since 5.6.3
*/
public static boolean isSynthetic(Method method) {
return method.isSynthetic();
}
/**
* 是否是合成类由java编译器生成的
*
* @param clazz
* @return 是否是合成
* @since 5.6.3
*/
public static boolean isSynthetic(Class<?> clazz) {
return clazz.isSynthetic();
}
//-------------------------------------------------------------------------------------------------------- Private method start
/**
* 多个修饰符做操作表示同时存在多个修饰符

View File

@ -2,6 +2,7 @@ package cn.hutool.core.util;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.text.TextSimilarity;
import java.io.StringReader;
@ -15,207 +16,7 @@ import java.util.Map;
*
* @author xiaoleilu
*/
public class StrUtil extends CharSequenceUtil {
/**
* 字符常量空格符 {@code ' '}
*/
public static final char C_SPACE = CharUtil.SPACE;
/**
* 字符常量制表符 {@code '\t'}
*/
public static final char C_TAB = CharUtil.TAB;
/**
* 字符常量 {@code '.'}
*/
public static final char C_DOT = CharUtil.DOT;
/**
* 字符常量斜杠 {@code '/'}
*/
public static final char C_SLASH = CharUtil.SLASH;
/**
* 字符常量反斜杠 {@code '\\'}
*/
public static final char C_BACKSLASH = CharUtil.BACKSLASH;
/**
* 字符常量回车符 {@code '\r'}
*/
public static final char C_CR = CharUtil.CR;
/**
* 字符常量换行符 {@code '\n'}
*/
public static final char C_LF = CharUtil.LF;
/**
* 字符常量下划线 {@code '_'}
*/
public static final char C_UNDERLINE = CharUtil.UNDERLINE;
/**
* 字符常量逗号 {@code ','}
*/
public static final char C_COMMA = CharUtil.COMMA;
/**
* 字符常量花括号 <code>'{'</code>
*/
public static final char C_DELIM_START = CharUtil.DELIM_START;
/**
* 字符常量花括号 <code>'}'</code>
*/
public static final char C_DELIM_END = CharUtil.DELIM_END;
/**
* 字符常量中括号 {@code '['}
*/
public static final char C_BRACKET_START = CharUtil.BRACKET_START;
/**
* 字符常量中括号 {@code ']'}
*/
public static final char C_BRACKET_END = CharUtil.BRACKET_END;
/**
* 字符常量冒号 {@code ':'}
*/
public static final char C_COLON = CharUtil.COLON;
/**
* 字符常量艾特 {@code '@'}
*/
public static final char C_AT = CharUtil.AT;
/**
* 字符串常量制表符 {@code "\t"}
*/
public static final String TAB = " ";
/**
* 字符串常量 {@code "."}
*/
public static final String DOT = ".";
/**
* 字符串常量双点 {@code ".."} <br>
* 用途作为指向上级文件夹的路径{@code "../path"}
*/
public static final String DOUBLE_DOT = "..";
/**
* 字符串常量斜杠 {@code "/"}
*/
public static final String SLASH = "/";
/**
* 字符串常量反斜杠 {@code "\\"}
*/
public static final String BACKSLASH = "\\";
/**
* 字符串常量回车符 {@code "\r"} <br>
* 解释该字符常用于表示 Linux 系统和 MacOS 系统下的文本换行
*/
public static final String CR = "\r";
/**
* 字符串常量换行符 {@code "\n"}
*/
public static final String LF = "\n";
/**
* 字符串常量Windows 换行 {@code "\r\n"} <br>
* 解释该字符串常用于表示 Windows 系统下的文本换行
*/
public static final String CRLF = "\r\n";
/**
* 字符串常量下划线 {@code "_"}
*/
public static final String UNDERLINE = "_";
/**
* 字符串常量减号连接符 {@code "-"}
*/
public static final String DASHED = "-";
/**
* 字符串常量逗号 {@code ","}
*/
public static final String COMMA = ",";
/**
* 字符串常量花括号 <code>"{"</code>
*/
public static final String DELIM_START = "{";
/**
* 字符串常量花括号 <code>"}"</code>
*/
public static final String DELIM_END = "}";
/**
* 字符串常量中括号 {@code "["}
*/
public static final String BRACKET_START = "[";
/**
* 字符串常量中括号 {@code "]"}
*/
public static final String BRACKET_END = "]";
/**
* 字符串常量冒号 {@code ":"}
*/
public static final String COLON = ":";
/**
* 字符串常量艾特 {@code "@"}
*/
public static final String AT = "@";
/**
* 字符串常量HTML 空格转义 {@code "&nbsp;" -> " "}
*/
public static final String HTML_NBSP = XmlUtil.NBSP;
/**
* 字符串常量HTML And 符转义 {@code "&amp;" -> "&"}
*/
public static final String HTML_AMP = XmlUtil.AMP;
/**
* 字符串常量HTML 双引号转义 {@code "&quot;" -> "\""}
*/
public static final String HTML_QUOTE = XmlUtil.QUOTE;
/**
* 字符串常量HTML 单引号转义 {@code "&apos" -> "'"}
*/
public static final String HTML_APOS = XmlUtil.APOS;
/**
* 字符串常量HTML 小于号转义 {@code "&lt;" -> "<"}
*/
public static final String HTML_LT = XmlUtil.LT;
/**
* 字符串常量HTML 大于号转义 {@code "&gt;" -> ">"}
*/
public static final String HTML_GT = XmlUtil.GT;
/**
* 字符串常量 JSON {@code "{}"}
*/
public static final String EMPTY_JSON = "{}";
public class StrUtil extends CharSequenceUtil implements StrPool {
// ------------------------------------------------------------------------ Blank

View File

@ -0,0 +1,19 @@
package cn.hutool.core.lang.func;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
public class LambdaUtilTest {
@Test
public void getMethodNameTest(){
String methodName = LambdaUtil.getMethodName(MyTeacher::getAge);
Assert.assertEquals("getAge", methodName);
}
@Data
static class MyTeacher{
public String age;
}
}