【问题标题】:Stream sorted() leads to unexpected resultsStream sorted() 导致意外结果
【发布时间】:2021-04-24 03:00:54
【问题描述】:

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

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);

实际输出:

abhi
alex
anna
amanda

预期输出:

abhi
alex
amanda
anna

我在这里错过了什么?

【问题讨论】:

    标签: java sorting java-8 java-stream


    【解决方案1】:

    您首先排序,然后才对元素应用toLowerCase,因为Anna 有大写A,所以amanda 之前。

    改为执行以下操作:

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

    输出:

    abhi
    alex
    amanda
    anna
    

    【讨论】:

      【解决方案2】:

      您在forEachOrdered之前缺少.sorted()调用,否则应用.toLowerCase()后流的内容将无法排序。

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

      【讨论】:

      • 所以基本上.sorted()在调用链中的位置是错误的,因此不会有任何效果?
      • @RobertHarvey 它有效果,但不是想要的效果,因为它将大写字母排在小写字母之前。
      • @RobertHarvey 它确实有效果,但正如 Dreamcash 的回答所述,“Anna”中的大写字母“A”位于“amanda”中的小写“a”之前。 .sorted() 调用需要在 .toLowerCase() 之后才能正确。
      • 不确定接受哪个答案,因为您和 dreamcrash 同时回答。
      • @AjayKumar 去寻找 dreamcash 的答案:他们解释了为什么 .sorted() 不能按预期工作。
      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多