sin*_*ash 1 java string lambda uppercase java-8
我想创建一个基本程序,通过lambdas 输入将字符串的第一个字符转换为大写
singhakash
Run Code Online (Sandbox Code Playgroud)
产量
Singhakash
Run Code Online (Sandbox Code Playgroud)
我试过了
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);
Run Code Online (Sandbox Code Playgroud)
但对于这两种情况,我必须单独打印第一个字符.如果没有单独的打印声明,我有什么方法可以做到这一点?
注意:我通常可以通过循环或任何其他方法来做到这一点,但我正在寻找lambdas唯一的解决方案.
谢谢
你可以这样做:
String st = "singhakash";
IntStream.range(0, st.length())
.mapToObj(i -> i == 0 ? Character.toUpperCase(st.charAt(i)) : st.charAt(i))
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
最简单的方法是
String result = Character.toUpperCase(st.charAt(0))+st.substring(1);
Run Code Online (Sandbox Code Playgroud)
如果您觉得必须对其进行优化,即减少复制操作的次数(而不是让JVM执行此操作),您可以使用:
StringBuilder sb=new StringBuilder(st);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
String result=sb.toString();
Run Code Online (Sandbox Code Playgroud)
但如果真的必须使用花哨的新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();
Run Code Online (Sandbox Code Playgroud)
该解决方案甚至可以正确处理补充代码点,因此它甚至比简单的解决方案更具优势(尽管使这些补充代码点也不太难).
如果要直接打印,可以使用
IntStream.concat(
IntStream.of(st.codePointAt(0)).map(Character::toUpperCase), st.codePoints().skip(1))
.forEach(cp -> System.out.print(Character.toChars(cp)));
Run Code Online (Sandbox Code Playgroud)