第6章 ストリームを使ったデータ処理 ストリームを使ったデータ処理
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
ほとんどのプログラミング言語では、データを処理する必要がある。 命令型アプローチでは、ループを使って要素を繰り返し処理し、各要素を順番に処理する。 しかし、関数型言語では宣言型アプローチが好まれ、古典的なループ文がないこともある。
Java 8で導入されたStreams APIは、完全な宣言型かつ遅延評価型のデータ処理アプローチを提供し、ほとんどの演算順序に高階関数を利用することで、Javaの関数型追加機能の利点を享受できる。
この章では、命令型データ処理と宣言型データ処理の違いについて学ぶ。 その後、ストリームの基本概念を視覚的に紹介し、データ処理により機能的なアプローチを実現するために、ストリームの柔軟性を最大限に活用する方法を紹介する。
反復によるデータ処理
データを処理することは、おそらくこれまで何百万回も遭遇してきたし、今後も遭遇し続けるであろう日常的な作業だ。
大まかな見方をすれば、どのようなタイプのデータ処理もパイプラインのように機能する。Collectionのようなデータ構造が要素を提供し、フィルタリングや要素の変換のような1つ以上の演算子があり、最後に何らかの形で結果を提供する。 結果は別のデータ構造かもしれないし、別のタスクを実行するためにそれを使うかもしれない。
簡単なデータ処理の例から始めよう。
外部反復
たとえば、Book インスタンスのリストから、タイトル順に並べられた1970年以前の3冊のSF本を発見する必要があるとしよう。例6-1は、for-ループを使った典型的な命令形アプローチを使った方法を示している。
例6-1. for-ループで本を発見する。
recordBook(Stringtitle,intyear,Genregenre){// NO BODY}// DATA PREPARATIONList<Book>books=...;Collections.sort(books,Comparator.comparing(Book::title));// FOR-LOOPList<String>result=newArrayList<>();for(varbook:books){if(book.year()>=1970){continue;}if(book.genre()!=Genre.SCIENCE_FICTION){continue;}vartitle=book.title();result ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access