使用流 API 设置字符串全部小写但首字母大写

Using stream API to set strings all lowercase but capitalize first letter

我有一个 List<String> 并且通过仅使用流 API 我将所有字符串设置为小写,将它们从最小字符串排序到最大字符串并打印它们。我遇到的问题是将字符串的第一个字母大写。

这是我通过 .stream().map() 做的事情吗?

public class Main {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
        list.stream()
            .map(n -> n.toLowerCase())
            .sorted((a, b) -> a.length() - b.length())
            .forEach(n -> System.out.println(n));;

    }

}

输出:

me
to
you
some
from
strings

期望的输出:

Me
To
You
Some
From
Strings

像这样应该就足够了:

 list.stream()
     .map(n -> n.toLowerCase())
     .sorted(Comparator.comparingInt(String::length))
     .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
     .forEachOrdered(n -> System.out.println(n));
  1. 请注意,我已经更改了比较器,这基本上是惯用的方法。
  2. 我在第一个字母大写排序后添加了一个 map 操作。
list.stream()
    .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
    .sorted(Comparator.comparingInt(String::length))
    .forEach(System.out::println);

为了便于阅读,执行大写的行应该移到一个方法中,

public class StringUtils {
    public static String capitalise(String s) {
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }
}

因此您可以通过 eloquent 方法引用来引用它:

list.stream()
    .map(StringUtils::capitalise)
    .sorted(Comparator.comparingInt(String::length))
    .forEach(System.out::println);

为此,您可以使用 Apache Commons Lang 中的 WordUtils::capitalizeFully

 list.stream()
     .sorted(Comparator.comparingInt(String::length))
     .map(WordUtils::capitalizeFully)
     .forEach(System.out::println);