我试图按字母顺序对列表进行排序,并将每个名字的第一个字母大写。
当我执行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);
答案 0 :(得分:7)
您需要使用lambda来获取当前的尝试,例如:
.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);
答案 1 :(得分:3)
如果您可以使用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
。
答案 2 :(得分:3)
其他答案告诉您使用以下其中一项:
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)
虽然这些都适用于Basic Multilingual Plane中的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
:dzDzDZLATIN LETTER LJ
:ljLjLJLATIN LETTER NJ
:njNjNJ大多数人并不关心上述情况,但是应该考虑全面实施“仅首字母大写”。
这样的事情可以做到:
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)
答案 3 :(得分:2)
或者只是使用apache-commons StringUtil.capitalize() 我很了解它。
.map(StringUtils::capitalize)
答案 4 :(得分:1)
hello string javatpoint
hello stringjavatpoint