簡體   English   中英

Java groupingBy收集器是否保留列表順序?

[英]Does Java groupingBy collector preserve list order?

考慮一個列表List<People> ,其中元素以People.getAge()升序排序。 如果我們使用Collectors.groupingBy(People::getCity)對列表進行分組,那么每個組/城市的結果列表是否會按年齡排序?

實際上,它似乎可以保留順序。 我在尋找保證。

該方法的Javadoc說:

如果不需要保留元素在結果Map收集器中出現的順序,則使用groupingByConcurrent(Function)可能會提供更好的並行性能

我不確定這是否涉及列表中項目的順序。

理解合同的關鍵是它說“元素出現的順序”。 它討論它們是否按順序到達,這意味着它們是否按順序傳遞給鍵提取器Function和任何下游收集器。 它沒有說訂單是否會保留在任何結果累加中。 實際上, groupingBy的當前實現使用不保留鍵順序的HashMap

您詢問它是否涉及列表中項目的順序。 如果您引用的是創建流的列表,則在列表上創建的流確實開始是有序的,但是某些流操作會更改順序或使其無序,因此其引用的順序是指管道之后的結果順序如果流保持有序,則操作完成。 如果流操作使流無序,則元素在收集器中出現的順序不再是問題。

如果要引用列表中項目的順序,那么將分組項目收集到該列表中,是的,因為它是“元素出現的順序”是元素處理的順序。 分組到下游收集器時也是如此。 如果Stream仍然是有序的,並且您分組到一個保留順序的下游收集器,則它將保留該順序,而Concurrent版本則不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM