Ale*_*tig 5 java java-8 java-stream
我有一个对象流,我想对其进行自然排序,但也强制其中一个成员始终位于第一位。
例如:
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);
Run Code Online (Sandbox Code Playgroud)
这会产生
[d, a, f, s]
Run Code Online (Sandbox Code Playgroud)
也就是说,按字母顺序排列,但以“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);
Run Code Online (Sandbox Code Playgroud)
这会产生相同的结果,并且在我看来更具可读性。
但是,我没有看到其他人这样做的例子。
此外,IntelliJ IDEA 将第一次.sorted()调用标记为冗余。它说“随后的‘排序’调用使排序变得毫无用处”。
这显然是不正确的,因为删除调用会将输出更改为
[d, a, s, f]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:.sorted(...)对 Stream 的多次调用是否定义了行为,还是我只是运气好?
换句话说,这是.sorted()我可以依赖的受支持的使用,还是它只是现在才起作用,并且可能在将来的某个 Java 版本中停止工作?
当你说“定义”时,我假设你在问“排序是否稳定”?如果是这样,那么是的。
第二个示例片段的第一次sorted()调用将根据自然顺序对元素进行排序,然后根据提供的比较器再次排序。
第二种方法的问题是效率低下,因为它需要两次排序操作,因此人们可能会决定继续使用第一种方法。
| 归档时间: |
|
| 查看次数: |
2056 次 |
| 最近记录: |