2017-03-01 7 views
40

私は、Javaのドキュメントを読み、this sentenceを発生しました:Javaストリームで「エスケープハッチ操作」とは何ですか?

エスケープハッチ操作iterator()spliterator()を除き、実行は端末操作が呼び出されたときに始まり、および端末操作が完了したときに終了します。

「エスケープ・ハッチ操作」とは何かわかりません。誰かがこの言葉を説明できますか?

答えて

39

streamパッケージのjavadocから:ほとんどすべてのケースで

ターミナル事業は が戻る前に、パイプラインのデータソースと処理のその トラバーサルを完了し、熱望しています。端末操作iterator()およびspliterator() のみがそうではありません。既存の 操作ではタスクが十分でない場合に、任意の がクライアント制御のパイプライントラバーサルを有効にするための「エスケープハッチ」として提供されます。なく、iterator()spliterator()の場合の端末操作返すとき、ほとんどの場合、ストリームトラバースが完了したことを意味

:これらの端末操作Iterator又はSpliteratorのいずれかを使用して返されるが、パイプラインは依然として「オープン」であり、要素がイテレータを介して要求されると処理されます。ストリーム上の操作は次の要素が要求された場合にのみ実行されるため、このようにストリーム処理は遅延になります。 iterator()メソッドが呼び出された後

Iterator<Person> iterator = persons 
    .stream() 
    .filter(p -> !p.getName().equals("Mike Tyson")) 
    .iterator(); 

、ストリームは、「終了」されています。あなたはより多くのメソッドをチェーンすることはできません。しかし、返されたイテレータのメソッドnext()を呼び出すことで、ストリームの要素にアクセスすることができ、ストリームは最初にこれを行うときにのみ処理が開始されます。これは、iterator()またはspliterator()端末操作が使用されている場合にのみ当てはまります。

関連する問題