代码之家  ›  专栏  ›  技术社区  ›  Alex Wittig

多个排序(…)调用Java 8流

  •  4
  • Alex Wittig  · 技术社区  · 7 年前

    我有一个我想要自然排序的对象流,但也强制其中一个成员总是第一个。

    例如:

    List<String> result = Stream.of("a", "s", "d", "f")
            .sorted(Comparator.comparing((String s) -> !s.equals("d"))
                                .thenComparing(Comparator.naturalOrder()))
            .collect(toList());
    System.out.println(result);
    

    这就产生了

    [d, a, f, s]
    

    也就是说,按字母顺序,但首先是“d”。

    我注意到我也可以用多个 .sorted(...) 电话:

    List<String> result = Stream.of("a", "s", "d", "f")
            .sorted()
            .sorted(Comparator.comparing(s -> !s.equals("d")))
            .collect(toList());
    System.out.println(result);
    

    这会产生相同的结果,并且更具可读性。

    但是,我没有看到其他人这样做的例子。

    此外,Intellij IDEA标记第一个 .sorted() 作为冗余呼叫。它说“随后的‘排序’调用使排序无用”。

    这显然是不真实的,因为移除调用会将输出更改为

    [d, a, s, f]
    

    所以我的问题是:是多重的吗? .排序(…) 调用流定义的行为,还是我只是运气好?

    换句话说,这是支持使用 。已排序() 我可以依赖它,或者它只是在现在工作,并且可能在将来的Java版本中停止工作?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Ousmane D.    7 年前

    当你说“定义”时,我假设你在问“种类是否稳定”?如果是这样,那么是的。

    第一个 sorted() 第二个示例片段的调用将根据自然顺序对元素进行排序,然后进行排序 再一次 根据提供的比较器。

    第二种方法的问题是 效率低下的 由于它需要两个排序操作,因此可以决定继续使用第一种方法。