仅使用 java 8 个 lambda 将字符串的第一个字符转换为大写

convert first character of string to uppercase using java 8 lambdas only

我想创建一个基本程序,通过 lambda 将字符串的第一个字符转换为大写 输入

singhakash

输出

Singhakash

我试过了

String st = "singhakash";

//approach 1
System.out.print(st.substring(0, 1).toUpperCase());
st.substring(1).codePoints()
               .forEach(e -> System.out.print((char) e));

System.out.println();

//approach 2
System.out.print(st.substring(0, 1).toUpperCase());
IntStream.range(0, st.length())
         .filter(i -> i > 0)
         .mapToObj(st::charAt)
         .forEach(System.out::print);

但是对于这两种情况,我都必须打印第一个字符 seperately.Is 有什么方法可以做到这一点而无需单独的打印语句?

注意:我通常可以通过循环或任何其他方法来做到这一点,但我正在寻找仅限 lambda 的解决方案。

谢谢

String 在 Java 中是不可变的。只需大写第一个字符,然后附加其余字符。像,

System.out.println(Character.toUpperCase(st.charAt(0)) + st.substring(1));

你可以这样做:

String st = "singhakash";
IntStream.range(0, st.length())
         .mapToObj(i -> i == 0 ? Character.toUpperCase(st.charAt(i)) : st.charAt(i))
         .forEach(System.out::print);

最简单的方法是

String result = Character.toUpperCase(st.charAt(0))+st.substring(1);

如果你觉得你必须优化它,即减少复制操作的数量(而不是让 JVM 来做),你可以使用:

StringBuilder sb=new StringBuilder(st);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
String result=sb.toString();

但如果真的必须使用新的 Java 8 功能来完成,您可以使用

String result=IntStream.concat(
    IntStream.of(st.codePointAt(0)).map(Character::toUpperCase), st.codePoints().skip(1) )
  .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
  .toString();

这个解决方案甚至可以正确处理补充代码点,因此它甚至比简单的解决方案更有优势(尽管让这些补充代码点也知道也不会太难)。

如果想直接打印,可以使用

IntStream.concat(
    IntStream.of(st.codePointAt(0)).map(Character::toUpperCase), st.codePoints().skip(1))
 .forEach(cp -> System.out.print(Character.toChars(cp)));

st.replaceFirst(st.subSequence(0,1).toString(),st.subSequence(0,1).toString().toUpperCase().codePoints().forEach(e -> System.out.print((char)e));