Я пытаюсь отсортировать свой список по алфавиту, а также использовать первую букву каждого имени с заглавной буквы.
Когда я делаю 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))
Идентификатор 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
В других ответах вам предлагается использовать один из следующих вариантов:
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. Это имеет значение для следующих символов (показаны строчные, заглавные и заглавные буквы):
Большинство людей не заботятся о вышеперечисленном, но полная реализация принципа «использовать только первую букву» должна учитывать их.
Что-то вроде этого подойдет:
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 Он также не создает новую строку, если ввод уже написан с заглавной буквы. :-)
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);
}
}
Вы имеете в виду
.map(name -> name.substring(0,1).toUpperCase() + name.substring(1))?