Stream sorted() 导致意外结果

Aja*_*mar 6 java sorting java-8 java-stream

我有一个数组和一个如下所示的流。

String[] names = {"Alex", "Anna", "Abhi", "Some", "Broad", "Dustin", 
                  "amanda", "Hanna", "Steve", "Sydney"};
        
Stream.of(names)
        .sorted()
        .map(String::toLowerCase)
        .filter(x -> x.startsWith("a"))
        .forEachOrdered(System.out::println);
        //I have also tried - .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

实际输出:

abhi
alex
anna
amanda
Run Code Online (Sandbox Code Playgroud)

预期输出:

abhi
alex
amanda
anna
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

dre*_*ash 16

您首先进行排序,然后才对toLowerCase元素应用 ,因为Anna资本A会在amanda.

请改为执行以下操作:

Stream.of(names)
        .map(String::toLowerCase)
        .filter(x -> x.startsWith("a"))
        .sorted()
        .forEachOrdered(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出:

abhi
alex
amanda
anna
Run Code Online (Sandbox Code Playgroud)


Bil*_*own 5

您错过了.sorted()之前的调用forEachOrdered,否则应用后流的内容将不会被排序.toLowerCase()

什么forEachOrdered按照它们在流中的顺序在流中的每个项目上运行一个函数;它不会对值本身进行排序。

  • @RobertHarvey 它有效果,但不是所需的效果,因为它会将大写字母排在小写字母之前。 (3认同)
  • @AjayKumar 去寻找 dreamcash 的答案:他们的答案解释了为什么 `.sorted()` 不能按预期工作。 (2认同)