java to do_java-将连字号分隔的字词(例如“ do-some-stuff”)转换为小写的驼峰形式(例如“ doSomeStuff”)的最优雅方法是什么?...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值