2015-10-26 4 views
1

Я хочу создать базовую программу преобразования первого символа строки в верхний регистр через лямбдах входногопреобразовать первый символ строки в верхний регистр с помощью Java 8 лямбды только

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

Но для обоих случаев я должен печатать первый символ отдельно. Я могу сделать это, не имея отдельной инструкции печати?

Примечание: Я могу сделать это нормально с помощью петли или любого другого подхода, но я ищу только решение для лямбда.

Благодаря

+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 для ответа, но я практиковал лямбда, поэтому для этого я ищу лямбда-ответ. Я знаю, что с вашим подходом было бы намного проще, но я обязан использовать только лямбда только – 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

I [ (https://github.com/amaembo/streamex/commit/46efc8851f4bb7777da9db7991a9a8378227dcb2) методы 'mapFirst' /' MapLast' в мою библиотеку, которые применяют данную функцию сопоставления только к первому/последнему элементу потока (хотя текущая реализация не является очень оптимальный). Теперь это так же просто, как «IntStreamEx.ofCodePoints (str) .mapFirst (Character :: toUpperCase) .codePointsToString()'. Я не знаю, действительно ли такая функция действительно полезна, хотя ... –

+1

@ Тагир Валеев: будут разные мнения об этом, я думаю; ^) – Holger

0

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