partitioningBy会保留原始列表中元素的顺序吗?

4

我有一个 LocalDateTime 列表,需要在特定日期的午夜将其拆分。两个新列表中元素的顺序不应更改。

List<LocalDateTime> l = Arrays.asList(LocalDateTime.of(2017,10,24,7,0,0),LocalDateTime.of(2017,10,24,8,0,0),LocalDateTime.of(2017,10,25,7,0,0),LocalDateTime.of(2017,10,25,9,0,0));

Collectors.partitioningBy能保证顺序不变吗?
l.stream().collect(Collectors.partitioningBy(t-> t.isAfter(LocalDateTime.of(2017,10,25,0,0,0))))

输出:

{false=[2017-10-24T07:00, 2017-10-24T08:00], true=[2017-10-25T07:00, 2017-10-25T09:00]}

1
不会。在最简单的情况下,比如从有序源迭代单线程流,它可能会保留顺序,但是流本身并不保证任何特定的排序(除非你当然要求它这样做),收集器也是如此。 - M. Prokhorov
1
如жһњиң“е…Өе€—иҰЁе·Із»ЏжҺ’еғЏпәЊй‚Әд№€дғЊе€†жџӨж‰ңжҮ”Collectors.partitioningByж›өжњ‰ж•€зҺ‡гЂ‚еҢ“дҢ ж‰ң到拆分ж—Өжњџзљ„зөұеә•еђҺпәЊдңүеЏҮе€›е»ғеҺџе§‹е€—иҰЁзљ„дё¤дёҒе­ђе€—иҰЁгЂ‚ - Eran
2
@MProkhorov:如果流(streams)具有相应的遭遇顺序,它们将始终保持其顺序,即使处理顺序可能不同也是如此。这是流的重要特性。请参阅如何确保Java8流的处理顺序? - Holger
1个回答

7

内置收集器的文档明确提到Collector是无序收集器的情况,例如toSet()groupingByConcurrent(…)。所有未指定为无序的收集器将保留遇到的顺序,如果流是有序的,并且它们没有一个下游收集器本身是无序的。

partitioningBy(predicate)等同于partitioningBy(predicate, toList()),因此会保持遇到的顺序。

一个反例是partitioningBy(predicate, toSet()),它不保留任何顺序,同样,一个本身无序的流,例如hashSet.stream().collect(partitioningBy(predicate)),不对结果顺序做出任何保证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接