首先,这得是一个字符串,其次,他得有能力被改写为小写字母。
我搜罗了下,发现了以下几种工具方案:
应用场景
- Spring在代码中获取bean时使用类名称的类名首字母小写格式
- 我们自定义Bean时,获取Bean的方式
方案工具
1、自己编写一个工具类
代码语言:javascript复制暂且,我们把自己编写的工具类叫做
StringUtils
public static String toLowerCaseFirstOne(String str) {
if (Character.isLowerCase(str.charAt(0))) {
return str;
} else {
return (new StringBuilder()).append(Character.toLowerCase(str.charAt(0))).append(str.substring(1)).toString();
}
}
这的确是一个锻炼人的方案,可以给予程序员一个思考的空间。我Baidu了一下,这种代码编写方案在自定义工具类StringUtils
的比较多,相对应的还有首字母改为大写。
初学者可能还会截取第一个字符,然后转为小写,再拼接起来成为一个完整的字符串,这也不失为一种解决方案,我们也姑且放在SrtringUtils
工具类里面。
public static String toLowerCaseFirstOne(String word) {
if (StringUtils.isEmpty(word)) {
return null;
} else {
return word.substring(0, 1).toUpperCase() word.substring(1);
}
}
2、使用Hutool工具类
代码语言:javascript复制
Hutool
工具类的StrUtil
public static String lowerFirst(CharSequence str) {
if (null == str) {
return null;
}
if (str.length() > 0) {
char firstChar = str.charAt(0);
if (Character.isUpperCase(firstChar)) {
return Character.toLowerCase(firstChar) subSuf(str, 1);
}
}
return str.toString();
}
3、使用Commons Lang
代码语言:javascript复制
Commons Lang
下commons-lang
下的WordUtils
public static String uncapitalize(String str) {
return uncapitalize(str, null);
}
public static String uncapitalize(String str, char[] delimiters) {
int delimLen = (delimiters == null ? -1 : delimiters.length);
if (str == null || str.length() == 0 || delimLen == 0) {
return str;
}
int strLen = str.length();
StringBuffer buffer = new StringBuffer(strLen);
boolean uncapitalizeNext = true;
for (int i = 0; i < strLen; i ) {
char ch = str.charAt(i);
if (isDelimiter(ch, delimiters)) {
buffer.append(ch);
uncapitalizeNext = true;
} else if (uncapitalizeNext) {
buffer.append(Character.toLowerCase(ch));
uncapitalizeNext = false;
} else {
buffer.append(ch);
}
}
return buffer.toString();
}
4、使用Apache Commons Lang
代码语言:javascript复制
Apache Commons Lang
下commons-text
下的WordUtils
public static String uncapitalize(final String str) {
return uncapitalize(str, null);
}
public static String uncapitalize(final String str, final char... delimiters) {
if (StringUtils.isEmpty(str)) {
return str;
}
final Set<Integer> delimiterSet = generateDelimiterSet(delimiters);
final int strLen = str.length();
final int[] newCodePoints = new int[strLen];
int outOffset = 0;
boolean uncapitalizeNext = true;
for (int index = 0; index < strLen;) {
final int codePoint = str.codePointAt(index);
if (delimiterSet.contains(codePoint)) {
uncapitalizeNext = true;
newCodePoints[outOffset ] = codePoint;
index = Character.charCount(codePoint);
} else if (uncapitalizeNext) {
final int titleCaseCodePoint = Character.toLowerCase(codePoint);
newCodePoints[outOffset ] = titleCaseCodePoint;
index = Character.charCount(titleCaseCodePoint);
uncapitalizeNext = false;
} else {
newCodePoints[outOffset ] = codePoint;
index = Character.charCount(codePoint);
}
}
return new String(newCodePoints, 0, outOffset);
}
可以参考官方提供的文档:commons-text
5、使用Apache Commons Lang
代码语言:javascript复制
Apache Commons Lang
下commons-lang3
下的WordUtils
public static String uncapitalize(final String str) {
return uncapitalize(str, null);
}
public static String uncapitalize(final String str, final char... delimiters) {
final int delimLen = delimiters == null ? -1 : delimiters.length;
if (StringUtils.isEmpty(str) || delimLen == 0) {
return str;
}
final char[] buffer = str.toCharArray();
boolean uncapitalizeNext = true;
for (int i = 0; i < buffer.length; i ) {
final char ch = buffer[i];
if (isDelimiter(ch, delimiters)) {
uncapitalizeNext = true;
} else if (uncapitalizeNext) {
buffer[i] = Character.toLowerCase(ch);
uncapitalizeNext = false;
}
}
return new String(buffer);
}
备注:当前commons-lang3
下的WordUtils
的类已经不再支持使用,建议使用第4种方案 commons-text
下的WordUtils
关于方法的思考
我打算做一个简单的实验设计下哪一种方案在执行过程中处理时间比较少。找三组数据:
- WordUtils
- WordUtilsWordUtilsWordUtilsWordUtils
- WordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtilsWordUtils
分别使用上述方案执行,然后记录下Main方法执行的时间。经过自己机器处理分别得出下面的几组实验数据(执行时间,单位毫秒):
上面得到的数据差别不是很大,至于选择哪一种方案,自己甄别下。
执行实验设计的Main方法:
代码语言:javascript复制 public static void main(String[] args) {
long startTime = System.currentTimeMillis();
System.out.println(StringUtil.toLowerCaseFirstOne("WordUtils"));
long endTime = System.currentTimeMillis();
System.out.println(String.format("开始时间:%s 结束时间:%s 相差时间:%s", startTime, endTime, endTime - startTime));
}