【问题标题】:convert first character of string to uppercase using java 8 lambdas only仅使用 java 8 lambdas 将字符串的第一个字符转换为大写
【发布时间】:2015-10-26 18:08:48
【问题描述】:

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

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);

但是对于这两种情况,我必须单独打印第一个字符。有没有什么方法可以在没有单独的打印语句的情况下做到这一点?

注意:我可以通过循环或任何其他方法正常执行此操作,但我正在寻找仅 lambdas 的解决方案。

谢谢

【问题讨论】:

  • 你真的必须使用 lambda 吗?
  • @dguay 是的,我只能使用 lambdas

标签: java string lambda java-8 uppercase


【解决方案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);

【讨论】:

    【解决方案2】:

    最简单的方法是

    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)));
    

    【讨论】:

    • I committed mapFirst/mapLast 将给定的映射器函数应用于我的库的方法仅应用于第一个/最后一个流元素(尽管当前的实现不是非常理想)。现在它就像IntStreamEx.ofCodePoints(str).mapFirst(Character::toUpperCase).codePointsToString() 一样简单。我不知道这样的功能是否真的有用......
    • @Tagir Valeev:我猜会有不同的意见;^)
    【解决方案3】:

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

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

    【讨论】:

    • 感谢答案,但我正在练习 lambda,因此我正在寻找 lambda 答案。我知道用你的方法会容易得多,但我一定会只使用 lambdas
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多