java-将连字号分隔的字词(例如“ do-some-stuff”)转换为小写的驼峰形式(例如“ doSomeStuff”)的最优雅方法是什么?
在Java中将连字号分隔的字词(例如“ do-some-stuff”)转换为小写驼峰形式(例如“ doSomeStuff”)的最优雅的方法是什么?
Christopher Klewes asked 2020-06-24T21:16:00Z
10个解决方案
86 votes
使用番石榴的CaseFormat:
import static com.google.common.base.CaseFormat.*;
String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff");
Joachim Sauer answered 2020-06-24T21:16:08Z
14 votes
有了Java 8,终于有了一线希望:
Arrays.stream(name.split("\\-"))
.map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase())
.collect(Collectors.joining());
虽然需要将3条实际的线分开才能清晰地辨认ツ
(注意:"\\-"适用于每个问题的烤肉串案例,蛇形案例只需更改为"_")
earcam answered 2020-06-24T21:16:36Z
9 votes
以下方法应在O(n)中非常有效地处理任务。 我们只是遍历xml方法名称的字符,跳过任何“-”并在需要时大写字符。
public static String toJavaMethodName(String xmlmethodName) {
StringBuilder nameBuilder = new StringBuilder(xmlmethodName.length());
boolean capitalizeNextChar = false;
for (char c:xmlMethodName.toCharArray()) {
if (c == '-') {
capitalizeNextChar = true;
continue;
}
if (capitalizeNextChar) {
nameBuilder.append(Character.toUpperCase(c));
} else {
nameBuilder.append(c);
}
capitalizeNextChar = false;
}
return nameBuilder.toString();
}
Andreas_D answered 2020-06-24T21:16:57Z
8 votes
为什么不试试这个:
分割为“-”
每个单词大写,跳过第一个
加入
编辑:经过深思熟虑...在尝试实现这一点时,我发现没有简单的方法可以在Java中加入字符串列表。 除非您使用来自Apache的StringUtil。 因此,无论如何,您都需要创建StringBuilder,因此该算法会变得有些难看:(
代码:这是上述方法的示例。 可以使用Java编译器的人(抱歉,没有一个方便的工具)对此进行测试吗? 并与此处找到的其他版本进行基准测试?
public static String toJavaMethodNameWithSplits(String xmlMethodName)
{
String[] words = xmlMethodName.split("-"); // split on "-"
StringBuilder nameBuilder = new StringBuilder(xmlMethodName.length());
nameBuilder.append(words[0]);
for (int i = 1; i < words.length; i++) // skip first
{
nameBuilder.append(words[i].substring(0, 1).toUpperCase());
nameBuilder.append(words[i].substring(1));
}
return nameBuilder.toString(); // join
}
Daren Thomas answered 2020-06-24T21:17:39Z
6 votes
如果您不希望依赖于库,则可以使用正则表达式和String.format的组合。使用正则表达式来提取-之后的起始字符。将它们用作String.format的输入。有点棘手,但无需使用( explicit)循环;)。
public class Test {
public static void main(String[] args) {
System.out.println(convert("do-some-stuff"));
}
private static String convert(String input) {
return String.format(input.replaceAll("\\-(.)", "%S"), input.replaceAll("[^-]*-(.)[^-]*", "$1-").split("-"));
}
}
Arne Deutsch answered 2020-06-24T21:17:59Z
4 votes
这是Andreas回答的一个细微变化,其作用超出了OP的要求:
public static String toJavaMethodName(final String nonJavaMethodName){
final StringBuilder nameBuilder = new StringBuilder();
boolean capitalizeNextChar = false;
boolean first = true;
for(int i = 0; i < nonJavaMethodName.length(); i++){
final char c = nonJavaMethodName.charAt(i);
if(!Character.isLetterOrDigit(c)){
if(!first){
capitalizeNextChar = true;
}
} else{
nameBuilder.append(capitalizeNextChar
? Character.toUpperCase(c)
: Character.toLowerCase(c));
capitalizeNextChar = false;
first = false;
}
}
return nameBuilder.toString();
}
它处理一些特殊情况:
some.other$funky:chars?转换为someOtherFunkyChars
some.other$funky:chars? is converted to someOtherFunkyChars
some.other$funky:chars? is converted to someOtherFunkyChars
Sean Patrick Floyd answered 2020-06-24T21:20:28Z
2 votes
获取StringUtils的Apache公用jar。 然后可以使用大写方法
import org.apache.commons.lang.StringUtils;
public class MyClass{
public String myMethod(String str) {
StringBuffer buff = new StringBuffer();
String[] tokens = str.split("-");
for (String i : tokens) {
buff.append(StringUtils.capitalize(i));
}
return buff.toString();
}
}
Sean answered 2020-06-24T21:20:48Z
2 votes
由于我不喜欢只为一种方法添加库,因此我实现了自己的解决方案(从骆驼箱到蛇箱):
public String toSnakeCase(String name) {
StringBuilder buffer = new StringBuilder();
for(int i = 0; i < name.length(); i++) {
if(Character.isUpperCase(name.charAt(i))) {
if(i > 0) {
buffer.append('_');
}
buffer.append(Character.toLowerCase(name.charAt(i)));
} else {
buffer.append(name.charAt(i));
}
}
return buffer.toString();
}
需要根据输入/输出情况进行调整。
Pierre Lemée answered 2020-06-24T21:21:13Z
2 votes
对于那些在项目中具有com.fasterxml.jackson库并且不想添加番石榴的人,可以使用jaskson namingStrategy方法:
new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);
Chi Dov answered 2020-06-24T21:21:33Z
0 votes
遍历字符串。 找到连字符后,请将其删除,并大写下一个字母。
Noel M answered 2020-06-24T21:21:52Z