web-dev-qa-db-ja.com

Java stream map and collect-結果のコンテナの順序

List<MyObject> myList = new ArrayList<>(); 
//populate myList here

List<String> nameList = myList.stream()
        .map(MyObject::getName)
        .collect(Collectors.toList());

上記のコードでは、MyObjectnameList名の順序は、常にmyListの順序と同じであると期待できますか?

41
Lahiru Chandima

はい、パラレルストリームを使用している場合でも、明示的に unordered() モードに変換しない限り、これを期待できます。

順序はシーケンシャルモードでは変更されませんが、パラレルモードでは変更される場合があります。ストリームは次のいずれかになります:

  • unordered()呼び出しで明示的に非順序モードにした場合
  • ストリームソースが、順序付けられていないことを報告する場合(たとえば、HashSetストリームは順序付けが実装依存であり、信頼できないため、ストリームは順序付けられていません)
  • 順序付けされていない端末操作を使用している場合(たとえば、forEach()操作またはtoSet()などの順序付けされていないコレクターへの収集)

あなたの場合、これらの条件はどれも満たされていないため、ストリームは順序付けられています。

54
Tagir Valeev