T firstNonBlank(final T... strs) {
return ArrayUtil.firstMatch(StrUtil::isNotBlank, strs);
}
+ // endregion
- // ------------------------------------------------------------------------ lower and upper
+ // region ----- lower and upper
/**
* 原字符串首字母大写并在其首部添加指定字符串 例如:str=name, preString=get =》 return getName
@@ -3670,8 +3685,9 @@ public class CharSequenceUtil extends StrChecker {
}
return str.toString();
}
+ // endregion
- // ------------------------------------------------------------------------ filter
+ // region ----- filter
/**
* 过滤字符串
@@ -3697,8 +3713,9 @@ public class CharSequenceUtil extends StrChecker {
}
return sb.toString();
}
+ // endregion
- // ------------------------------------------------------------------------ case
+ // region ----- case
/**
* 给定字符串中的字母是否全部为大写,判断依据如下:
@@ -3713,16 +3730,7 @@ public class CharSequenceUtil extends StrChecker {
* @since 4.2.2
*/
public static boolean isUpperCase(final CharSequence str) {
- if (null == str) {
- return false;
- }
- final int len = str.length();
- for (int i = 0; i < len; i++) {
- if (Character.isLowerCase(str.charAt(i))) {
- return false;
- }
- }
- return true;
+ return NamingCase.isUpperCase(str);
}
/**
@@ -3738,16 +3746,7 @@ public class CharSequenceUtil extends StrChecker {
* @since 4.2.2
*/
public static boolean isLowerCase(final CharSequence str) {
- if (null == str) {
- return false;
- }
- final int len = str.length();
- for (int i = 0; i < len; i++) {
- if (Character.isUpperCase(str.charAt(i))) {
- return false;
- }
- }
- return true;
+ return NamingCase.isLowerCase(str);
}
/**
@@ -3764,23 +3763,7 @@ public class CharSequenceUtil extends StrChecker {
* @since 4.3.2
*/
public static String swapCase(final String str) {
- if (isEmpty(str)) {
- return str;
- }
-
- final char[] buffer = str.toCharArray();
-
- for (int i = 0; i < buffer.length; i++) {
- final char ch = buffer[i];
- if (Character.isUpperCase(ch)) {
- buffer[i] = Character.toLowerCase(ch);
- } else if (Character.isTitleCase(ch)) {
- buffer[i] = Character.toLowerCase(ch);
- } else if (Character.isLowerCase(ch)) {
- buffer[i] = Character.toUpperCase(ch);
- }
- }
- return new String(buffer);
+ return NamingCase.swapCase(str);
}
/**
@@ -3838,6 +3821,7 @@ public class CharSequenceUtil extends StrChecker {
public static String toCamelCase(final CharSequence name, final char symbol) {
return NamingCase.toCamelCase(name, symbol);
}
+ // endregion
// ------------------------------------------------------------------------ isSurround
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java b/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java
index 2e6319fb1..1a0951945 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/NamingCase.java
@@ -188,4 +188,84 @@ public class NamingCase {
}
}
+ /**
+ * 给定字符串中的字母是否全部为大写,判断依据如下:
+ *
+ *
+ * 1. 大写字母包括A-Z
+ * 2. 其它非字母的Unicode符都算作大写
+ *
+ *
+ * @param str 被检查的字符串
+ * @return 是否全部为大写
+ * @since 4.2.2
+ */
+ public static boolean isUpperCase(final CharSequence str) {
+ if (null == str) {
+ return false;
+ }
+ final int len = str.length();
+ for (int i = 0; i < len; i++) {
+ if (Character.isLowerCase(str.charAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 给定字符串中的字母是否全部为小写,判断依据如下:
+ *
+ *
+ * 1. 小写字母包括a-z
+ * 2. 其它非字母的Unicode符都算作小写
+ *
+ *
+ * @param str 被检查的字符串
+ * @return 是否全部为小写
+ * @since 4.2.2
+ */
+ public static boolean isLowerCase(final CharSequence str) {
+ if (null == str) {
+ return false;
+ }
+ final int len = str.length();
+ for (int i = 0; i < len; i++) {
+ if (Character.isUpperCase(str.charAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 切换给定字符串中的大小写。大写转小写,小写转大写。
+ *
+ *
+ * StrUtil.swapCase(null) = null
+ * StrUtil.swapCase("") = ""
+ * StrUtil.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
+ *
+ *
+ * @param str 字符串
+ * @return 交换后的字符串
+ * @since 4.3.2
+ */
+ public static String swapCase(final String str) {
+ if (StrUtil.isEmpty(str)) {
+ return str;
+ }
+
+ final char[] buffer = str.toCharArray();
+
+ for (int i = 0; i < buffer.length; i++) {
+ final char ch = buffer[i];
+ if (Character.isUpperCase(ch) || Character.isTitleCase(ch)) {
+ buffer[i] = Character.toLowerCase(ch);
+ } else if (Character.isLowerCase(ch)) {
+ buffer[i] = Character.toUpperCase(ch);
+ }
+ }
+ return new String(buffer);
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java
index 4ae56aca6..c330b776b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java
@@ -12,13 +12,24 @@ import cn.hutool.core.text.CharSequenceUtil;
public class StrFinder extends TextFinder {
private static final long serialVersionUID = 1L;
+ /**
+ * 创建查找器,构造后须调用{@link #setText(CharSequence)} 设置被查找的文本
+ *
+ * @param strToFind 查找的字符串
+ * @param caseInsensitive 是否忽略大小写
+ * @return {@code StrFinder}
+ */
+ public static StrFinder of(final CharSequence strToFind, final boolean caseInsensitive) {
+ return new StrFinder(strToFind, caseInsensitive);
+ }
+
private final CharSequence strToFind;
private final boolean caseInsensitive;
/**
* 构造
*
- * @param strToFind 被查找的字符串
+ * @param strToFind 查找的字符串
* @param caseInsensitive 是否忽略大小写
*/
public StrFinder(final CharSequence strToFind, final boolean caseInsensitive) {
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java b/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java
index de1696ac1..fe605912f 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/replacer/LookupReplacer.java
@@ -15,18 +15,18 @@ public class LookupReplacer extends StrReplacer {
private static final long serialVersionUID = 1L;
private final Map lookupMap;
- private final Set prefixSet;
+ private final Set keyPrefixSkeyet;
private final int minLength;
private final int maxLength;
/**
* 构造
*
- * @param lookup 被查找的键值对
+ * @param lookup 被查找的键值对,每个String[]表示一个键值对
*/
public LookupReplacer(final String[]... lookup) {
- this.lookupMap = new HashMap<>();
- this.prefixSet = new HashSet<>();
+ this.lookupMap = new HashMap<>(lookup.length, 1);
+ this.keyPrefixSkeyet = new HashSet<>(lookup.length, 1);
int minLength = Integer.MAX_VALUE;
int maxLength = 0;
@@ -35,7 +35,7 @@ public class LookupReplacer extends StrReplacer {
for (final String[] pair : lookup) {
key = pair[0];
lookupMap.put(key, pair[1]);
- this.prefixSet.add(key.charAt(0));
+ this.keyPrefixSkeyet.add(key.charAt(0));
keySize = key.length();
if (keySize > maxLength) {
maxLength = keySize;
@@ -50,7 +50,7 @@ public class LookupReplacer extends StrReplacer {
@Override
protected int replace(final CharSequence str, final int pos, final StringBuilder out) {
- if (prefixSet.contains(str.charAt(pos))) {
+ if (keyPrefixSkeyet.contains(str.charAt(pos))) {
int max = this.maxLength;
if (pos + this.maxLength > str.length()) {
max = str.length() - pos;
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java
index 0836700b4..7bc89cad4 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/split/SplitUtil.java
@@ -321,7 +321,7 @@ public class SplitUtil {
} else if (0 == text.length()) {
return ignoreEmpty ? new ArrayList<>(0) : ListUtil.of(StrUtil.EMPTY);
}
- final SplitIter splitIter = new SplitIter(text, new StrFinder(separator, ignoreCase), limit, ignoreEmpty);
+ final SplitIter splitIter = new SplitIter(text, StrFinder.of(separator, ignoreCase), limit, ignoreEmpty);
return splitIter.toList(isTrim);
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/text/split/SplitIterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/split/SplitIterTest.java
index bddc2f66e..ddd3262a6 100644
--- a/hutool-core/src/test/java/cn/hutool/core/text/split/SplitIterTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/text/split/SplitIterTest.java
@@ -74,7 +74,7 @@ public class SplitIterTest {
final String str1 = "a, ,,efedsfs, ddf,";
final SplitIter splitIter = new SplitIter(str1,
- new StrFinder("e", false),
+ StrFinder.of("e", false),
Integer.MAX_VALUE,
true
);
@@ -141,7 +141,7 @@ public class SplitIterTest {
public void splitByEmptyTest(){
final String text = "aa,bb,cc";
final SplitIter splitIter = new SplitIter(text,
- new StrFinder("", false),
+ StrFinder.of("", false),
3,
false
);