Java Stream .map использовать только первую букву с заглавной буквы

Я пытаюсь отсортировать свой список по алфавиту, а также использовать первую букву каждого имени с заглавной буквы.

Когда я делаю toUpperCase, каждая буква становится заглавной. Если бы я распечатал его без использования .map, я бы сделал (topNames2017.substring(0, 1).toUpperCase() + topNames2017.substring(1)), который отлично работает, но я не знаю, как применить его здесь

List<String> topNames2017 = Arrays.asList(
            "Amelia",
            "Olivia",
            "emily",
            "Isla",
            "Ava",
            "oliver",
            "Jack",
            "Charlie",
            "harry",
            "Jacob"
    );


      topNames2017
            .stream()
            .map(String::toUpperCase)
            .sorted()
            .forEach(System.out::println);

Вы имеете в виду .map(name -> name.substring(0,1).toUpperCase() + name.substring(1))?

Louis Wasserman 28.03.2018 22:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
4 236
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вам нужно будет использовать лямбда, чтобы ваша текущая попытка заработала, например:

.map(name -> name.substring(0, 1).toUpperCase() + name.substring(1))

Идентификатор name выше представляет текущую строку, переданную операции map.

Как вариант, это можно сделать так:

.map(name -> Character.toUpperCase(name.charAt(0)) + name.substring(1))

Если вы хотите сохранить использование ссылки на метод, вы можете определить свою собственную функцию следующим образом:

static String capitaliseFirstLetter(String name){
      return name.substring(0, 1).toUpperCase() + name.substring(1);
}

Теперь вы можете:

topNames2017.stream()
            .map(Main::capitaliseFirstLetter) // replace Main with the class containing the capitaliseFirstLetter method
            .sorted()
            .forEach(System.out::println);

Или просто используйте apache-commons StringUtil.capitalize () Я просто хорошо об этом знать.

.map(StringUtils::capitalize)

Подробнее здесь: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#capitalize(java.lang.String)

Если вы можете использовать Apache Commons, я бы предложил WordUtils.capitalize(String) как

topNames2017.stream()
        .map(WordUtils::capitalize)
        .sorted()
        .forEachOrdered(System.out::println);

Если вы не можете использовать это, вы мощь сделаете что-то вроде

topNames2017.stream()
        .map(x -> x.substring(0, 1).toUpperCase() + x.substring(1))
        .sorted()
        .forEachOrdered(System.out::println);

В любом случае, если вы выполняете сортировку, обязательно используйте forEachOrdered.

Плюс 1 для использования forEachOrdered

cpp beginner 28.03.2018 23:01

В других ответах вам предлагается использовать один из следующих вариантов:

name.substring(0, 1).toUpperCase() + name.substring(1)
Character.toUpperCase(name.charAt(0)) + name.substring(1)
StringUtils.capitalize(name) // Apache Commons Lang
WordUtils.capitalize(name) // Apache Commons Lang (deprecated)

Хотя все они работают с символами Unicode в Базовая многоязычная плоскость, в дополнительных плоскостях есть буквы, которые не будут так заглавными. Для справки, буквы в дополнительных плоскостях существуют в следующих блоках:

  • Deseret (от U + 10400 до U + 1044F)
  • Old Hungarian (от U + 10C80 до U + 10CFF)
  • Warang Citi (от U + 118A0 до U + 118FF)

Вам также следует использовать toTitleCase, а не toUpperCase. Это имеет значение для следующих символов (показаны строчные, заглавные и заглавные буквы):

  • LATIN LETTER DZ WITH CARON: dž Dž DŽ
  • LATIN LETTER DZ: dz Dz DZ
  • LATIN LETTER LJ: lj Lj LJ
  • LATIN LETTER NJ: nj Nj NJ

Большинство людей не заботятся о вышеперечисленном, но полная реализация принципа «использовать только первую букву» должна учитывать их.

Что-то вроде этого подойдет:

static String capitalizeFirstLetter(String s) {
    if (s == null || s.isEmpty())
        return s;
    int codePoint = s.codePointAt(0);
    int codePointTitle = Character.toTitleCase(codePoint);
    if (codePointTitle == codePoint)
        return s; // Nothing to capitalize
    return new String(new int[] { codePointTitle }, 0, 1)
         + s.substring(s.offsetByCodePoints(0, 1));
}

Затем вы используете это вместо String::toUpperCase:

.map(MyClass::capitalizeFirstLetter)

Помимо идеального объяснения, дополнительные похвалы за единственный ответ (исключая сторонние библиотеки) (на момент написания этого комментария), который не дает сбой на пустой строке.

mtj 29.03.2018 10:36

@mtj Он также не создает новую строку, если ввод уже написан с заглавной буквы. :-)

Andreas 29.03.2018 17:42
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

public class Task1c {

    public static void main (String args[]){

            List<String> topNames2017 = Arrays.asList(
                    "Amelia", 
                    "Olivia", 
                    "emily", 
                    "Isla", 
                    "Ava", 
                    "oliver", 
                    "Jack",
                    "Charlie", 
                    "harry", 
                    "Jacob"
            );
    topNames2017
        .stream()
        .map(name->{return Character.toUpperCase(name.charAt(0))+name.substring(1);})
        .sorted()
        .forEach(System.out::println);
    }
}

Другие вопросы по теме