Java 使用流API将字符串设置为所有小写,但首字母大写

Java 使用流API将字符串设置为所有小写,但首字母大写,java,java-8,mapping,java-stream,capitalization,Java,Java 8,Mapping,Java Stream,Capitalization,我有一个列表,通过仅使用流API,我将所有字符串设置为小写,从最小字符串到最大字符串排序并打印它们。我遇到的问题是将字符串的第一个字母大写 这是我通过.stream().map()做的事情吗 期望输出: Me To You Some From Strings 这样的东西应该足够了: list.stream() .map(n -> n.toLowerCase()) .sorted(Comparator.comparingInt(String::length))

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

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

期望输出:

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));
  • 请注意,我已经更改了comparator,它本质上是实现它的惯用方法
  • 在对第一个字母进行大写排序后,我添加了一个
    map
    操作
  • 为了可读性,执行资本化的行应移动到方法中

    public class StringUtils {
        public static String capitalise(String s) {
            return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
        }
    }
    
    因此,您可以通过雄辩的方法参考:

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

    您可以为此使用中的
    WordUtils::capitalizeFully
    from

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

    是的,很有效,谢谢!我不知道我可以对同一个流多次使用Map。@Devin您可以链接任意多个中间操作。请记住,
    forEach
    不提供排序保证,因此为了确保按排序顺序查看元素,您必须使用
    forEachOrdered
    @Devin,使用尽可能多的中间操作(filter/map/distinct/sorted/peek)根据需要。在应用了terminal方法(reduce/collect/foreach)之后,您已经“结束”了流。对于空字符串,将失败。请使用
    .map(s->s.isEmpty()?“”:Character.toUpperCase(s.charAt(0))+s.substring(1))
    OP只想大写第一个字母。此外,您没有提到
    WordUtils
    来自哪里…@AndrewTobilko WordUtils::Capitalizely就是这样做的。我已经提到了
    WordUtils
    来自哪里。新代码应该使用此方法的版本,因为该方法已被弃用。这将展示“比公认的答案更好的地方性,它将地图分为两类。@Alexa虽然a同意你的观点,但我只想指出,我决定在发布时不使用一个地图操作的唯一原因是保持每个中间操作的逻辑简短,易于理解,从而使它更容易操作。”呃,对于OP来说。记住,在一天结束时,OP对于Streams API来说似乎是一个新人,谈论其他任何事情都是一个额外的收获,但却会从他们的主要要点(第一个字符的大写)中拿走一些东西。顺便说一句,OP现在似乎知道可以使用多个“相同”的中间操作:)。
    public class StringUtils {
        public static String capitalise(String s) {
            return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
        }
    }
    
    list.stream()
        .map(StringUtils::capitalise)
        .sorted(Comparator.comparingInt(String::length))
        .forEach(System.out::println);
    
     list.stream()
         .sorted(Comparator.comparingInt(String::length))
         .map(WordUtils::capitalizeFully)
         .forEach(System.out::println);