Java Stream .map仅限首字母

时间:2018-03-28 20:39:28

标签: java string

我试图按字母顺序对列表进行排序,并将每个名字的第一个字母大写。

当我执行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);

5 个答案:

答案 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字符,但补充字体中的字母不会以这种方式大写。作为参考,补充平面中的字母存在于以下区块中:

您还应该使用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)

答案 3 :(得分:2)

或者只是使用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)

答案 4 :(得分:1)

 hello string   javatpoint
hello stringjavatpoint