partitioningBy是否保留原始列表中元素的顺序?

时间:2017-10-25 13:20:28

标签: java java-stream

我订购了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 个答案:

答案 0 :(得分:3)

Collector无序收集器时,documentation of the built-in collectors明确提及,例如适用于toSet()groupingByConcurrent(…)。未指定为无序的所有收集器将保留遭遇订单,如果订购了流并且它们没有本身无序的下游收集器

partitioningBy(predicate)相当于partitioningBy(predicate, toList()),因此会维持遭遇顺序。

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