2015-10-26 92 views
1

我想创建转换字符串的第一个字符通过lambda表达式为大写 输入的基本程序转换字符串的第一个字符使用Java 8个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); 

但是,对于这两种情况,我必须单独打印第一个字符。是否有任何方法可以在没有单独打印语句的情况下执行此操作?

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

感谢

+1

你真的有使用拉姆达? – dguay

+0

@dguay是的我只能用lambdas – silentprogrammer

回答

7

你可以做这样的:

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是Java不变。只是大写第一个字符,并附加其余的。喜欢的东西,

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

thnaks为答案,但我正在练习lambda,所以我正在寻找lambda答案。我知道这将是更容易与您的方法,但我只能使用lambdas只有 – silentprogrammer

4

做最简单的方法是将

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

我[提交](https://github.com/amaembo/streamex/commit/46efc8851f4bb7777da9db7991a9a8378227dcb2)'mapFirst' /'mapLast'方法到我的库,它只将给定的映射函数应用于第一个/最后一个流元素(尽管当前的实现不是非常优选)。现在它就像'IntStreamEx.ofCodePoints(str).mapFirst(Character :: toUpperCase).codePointsToString()'一样简单。我不知道这样的功能是否真的有用,虽然... –

+1

@Tagir Valeev:对此我会猜到不同的意见; ^) – Holger

0

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

相关问题