高橋  花子

高橋 花子

1653403440

JavaでStreamsAPIを使用しましたか?

これを読む前に、プログラミングの命令型および宣言型のスタイルを試して学ぶことをお勧めします。命令型と宣言型を参照してください

JDK 1.8をバンドルするときにJavaチームに含まれる強力な機能の1つは、StreamsAPIです。

ストリームの目的は、要素に対してさまざまな種類の操作を実行することにより、要素のシーケンスを処理することです。

ストリーム用の新しいJavaパッケージはjava.util.streamです。

#ストリームとは何ですか?

StreamsAPIの重要な側面のいくつかを見てみましょう。

  1. Streams APIは、オブジェクトのコレクションを処理するために使用されます。
  2. ストレージなし。ストリームは、配列/スタック/キューなどのようなデータ構造ではなく、コレクション、配列、またはI/Oチャネルからの入力を受け取ります。
  3. ストリームは元のデータ構造を変更せず、パイプライン化されたメソッドに従って結果を提供するだけです。
  4. ストリームは、コレクションデータに対して複雑なデータ処理操作を実行するために使用されます。これらは、データが流れるパイプラインと、データを操作するための関数を表します。
  5. ストリームでは、Lambda式を使用して、フィルターの反復処理とストリームを使用したコレクションからのデータの抽出を容易にすることで、コレクションライブラリを改善します。
  6. どのストリームにも、無制限の量のデータが流れる可能性があります。ストリームから受信したデータは、到着時に個別に処理されます。
  7. 本質的に機能的です。ストリームに対する操作は結果を生成しますが、そのソースは変更しません。たとえば、コレクションから取得したストリームをフィルタリングすると、ソースコレクションから要素を削除するのではなく、フィルタリングされた要素なしで新しいストリームが生成されます。
  8. 怠惰を求める。フィルタリング、マッピング、重複削除などの多くのストリーム操作は、遅延して実装できるため、最適化の機会が得られます。たとえば、「3つの連続する母音を持つ最初の文字列を見つける」では、すべての入力文字列を調べる必要はありません。ストリーム操作は、中間(ストリーム生成)操作と最終(値または副作用生成)操作に分けられます。中間操作は常に怠惰です。
  9. おそらく無制限。コレクションのサイズには限りがありますが、ストリームはその必要はありません。limit(n)やfindFirst()などの短絡操作により、無限ストリームの計算を有限時間で完了することができます。
  10. 消耗品。ストリームの要素は、ストリームの存続期間中に一度だけアクセスされます。イテレータと同様に、ソースの同じ要素に再度アクセスするには、新しいストリームを生成する必要があります。

#ストリームの作成

ストリームを作成する方法はいくつかあります。

  1. コレクションから。
  2. 配列から。
  3. 任意の数のオブジェクトから。
  4. 無限および有限のストリーム。

#利点

StreamsAPIを使用する利点は次のとおりです。

  1. 命令型アプローチと宣言型アプローチの違いはすでに見てきました。Streamsを使用すると、命令型プログラミングから宣言型プログラミングに移行します。
  2. ストリームは、、、、などListのコレクションにのみ適用できます。MapSetArrays
  3. ストリームは可変性の低下を促進します
  4. を使用して、コンテンツを並行して操作できますparallelStream()
  5. もう1つの利点/利点は、ストリームプロセスデータを遅延させることです。大きなファイルからテキストの行をストリームとして読み取っていると仮定します。これは、ストリームが必要に応じてデータをロードし、多くのメモリを節約することを意味します。

#Streamパイプライン

十分な話!例を見てみましょう🤩

ストリームパイプラインを理解するための例を見てみましょう。

書籍のリストがあり、、などのメソッドのチェーンを実行していますfiltermapこのメソッド呼び出しのチェーンは、ストリームパイプラインと呼ばれます。

関数を渡すため、これは関数型プログラミングとも呼ばれます。

Bookは、コンストラクター、ゲッター、およびセッターを備えたPOJOです。

class Book {
  String title;
  String author;
  Integer year;
  Integer copiesSoldInMillions;
  Double rating;
  Double costInEuros;

  public Book(String title, String author, Integer year, Integer copiesSoldInMillions, Double rating, Double costInEuros) {
    this.title = title;
    this.author = author;
    this.year = year;
    this.copiesSoldInMillions = copiesSoldInMillions;
    this.rating = rating;
    this.costInEuros = costInEuros;
  }

  public String getAuthor() {
    return author;
  }

  public Double getRating() {
    return rating;
  }

  @Override
  public String toString() {
    return "Book{" +
      "title='" + title + '\'' +
      ", author='" + author + '\'' +
      ", year=" + year +
      ", copiesSoldInMillions=" + copiesSoldInMillions +
      ", rating=" + rating +
      ", costInEuros=" + costInEuros +
      '}';
  }
}

BookDatabaseダミーデータインジェクション用の別のクラス。

import java.util.Arrays;
import java.util.List;

public class BookDatabase {
  public static List<Book> getAllBooks() {
    return Arrays.asList(
      new Book("Don Quixote", "Miguel de Cervantes", 1605, 500, 3.9, 9.99),
      new Book("A Tale of Two Cities", "Charles Dickens", 1859, 200, 3.9, 10.0),
      new Book("The Lord of the Rings", "J.R.R. Tolkien", 2001, 150, 4.0, 12.50),
      new Book("The Little Prince", "Antoine de Saint-Exupery", 2016, 142, 4.4, 5.0),
      new Book("The Dream of the Red Chamber", "Cao Xueqin", 1791, 100, 4.2, 10.0)
    );
  }
}

そして最後に、各オブジェクトBookApplicationで宣言型プログラミングまたは不変性を実行するクラスを終了します。book

import java.util.List;

public class BookApplication {
  public static void main(String[] args) {
    List<Book> books = BookDatabase.getAllBooks();

    books.stream()
      .filter(book -> book.getRating() >= 4)
      .map(Book::getAuthor)
      .forEach(System.out::println);
  }
}

出力:

J.R.R. Tolkien
Antoine de Saint-Exupery
Cao Xueqin

上記の例では、Bookオブジェクトのリストがあります。

  1. .stream(...)オブジェクトのリストをBookオブジェクトのストリームに変換するために適用しました。
  2. 述語.filter(...)取り、フィルタリングされたオブジェクトのストリームを取得する2つの中間操作を適用しました。.map(...)
  3. .forEach(...)すべてのオブジェクトを印刷するために終了しました。

#デメリット

  1. ストリームが適切に処理されない場合、パフォーマンスに大きな影響を与えます。
  2. 学習曲線は時間がかかります。学習する必要のある過負荷の方法がたくさんあるため、混乱を招きますが、欠点ではありませんが、ここでは欠点として残しておきたいと考えています。

ソース:https ://hackernoon.com/have-you-used-the-streams-api-in-java

#java #stream #api 

What is GEEK

Buddha Community

JavaでStreamsAPIを使用しましたか?
高橋  花子

高橋 花子

1653403440

JavaでStreamsAPIを使用しましたか?

これを読む前に、プログラミングの命令型および宣言型のスタイルを試して学ぶことをお勧めします。命令型と宣言型を参照してください

JDK 1.8をバンドルするときにJavaチームに含まれる強力な機能の1つは、StreamsAPIです。

ストリームの目的は、要素に対してさまざまな種類の操作を実行することにより、要素のシーケンスを処理することです。

ストリーム用の新しいJavaパッケージはjava.util.streamです。

#ストリームとは何ですか?

StreamsAPIの重要な側面のいくつかを見てみましょう。

  1. Streams APIは、オブジェクトのコレクションを処理するために使用されます。
  2. ストレージなし。ストリームは、配列/スタック/キューなどのようなデータ構造ではなく、コレクション、配列、またはI/Oチャネルからの入力を受け取ります。
  3. ストリームは元のデータ構造を変更せず、パイプライン化されたメソッドに従って結果を提供するだけです。
  4. ストリームは、コレクションデータに対して複雑なデータ処理操作を実行するために使用されます。これらは、データが流れるパイプラインと、データを操作するための関数を表します。
  5. ストリームでは、Lambda式を使用して、フィルターの反復処理とストリームを使用したコレクションからのデータの抽出を容易にすることで、コレクションライブラリを改善します。
  6. どのストリームにも、無制限の量のデータが流れる可能性があります。ストリームから受信したデータは、到着時に個別に処理されます。
  7. 本質的に機能的です。ストリームに対する操作は結果を生成しますが、そのソースは変更しません。たとえば、コレクションから取得したストリームをフィルタリングすると、ソースコレクションから要素を削除するのではなく、フィルタリングされた要素なしで新しいストリームが生成されます。
  8. 怠惰を求める。フィルタリング、マッピング、重複削除などの多くのストリーム操作は、遅延して実装できるため、最適化の機会が得られます。たとえば、「3つの連続する母音を持つ最初の文字列を見つける」では、すべての入力文字列を調べる必要はありません。ストリーム操作は、中間(ストリーム生成)操作と最終(値または副作用生成)操作に分けられます。中間操作は常に怠惰です。
  9. おそらく無制限。コレクションのサイズには限りがありますが、ストリームはその必要はありません。limit(n)やfindFirst()などの短絡操作により、無限ストリームの計算を有限時間で完了することができます。
  10. 消耗品。ストリームの要素は、ストリームの存続期間中に一度だけアクセスされます。イテレータと同様に、ソースの同じ要素に再度アクセスするには、新しいストリームを生成する必要があります。

#ストリームの作成

ストリームを作成する方法はいくつかあります。

  1. コレクションから。
  2. 配列から。
  3. 任意の数のオブジェクトから。
  4. 無限および有限のストリーム。

#利点

StreamsAPIを使用する利点は次のとおりです。

  1. 命令型アプローチと宣言型アプローチの違いはすでに見てきました。Streamsを使用すると、命令型プログラミングから宣言型プログラミングに移行します。
  2. ストリームは、、、、などListのコレクションにのみ適用できます。MapSetArrays
  3. ストリームは可変性の低下を促進します
  4. を使用して、コンテンツを並行して操作できますparallelStream()
  5. もう1つの利点/利点は、ストリームプロセスデータを遅延させることです。大きなファイルからテキストの行をストリームとして読み取っていると仮定します。これは、ストリームが必要に応じてデータをロードし、多くのメモリを節約することを意味します。

#Streamパイプライン

十分な話!例を見てみましょう🤩

ストリームパイプラインを理解するための例を見てみましょう。

書籍のリストがあり、、などのメソッドのチェーンを実行していますfiltermapこのメソッド呼び出しのチェーンは、ストリームパイプラインと呼ばれます。

関数を渡すため、これは関数型プログラミングとも呼ばれます。

Bookは、コンストラクター、ゲッター、およびセッターを備えたPOJOです。

class Book {
  String title;
  String author;
  Integer year;
  Integer copiesSoldInMillions;
  Double rating;
  Double costInEuros;

  public Book(String title, String author, Integer year, Integer copiesSoldInMillions, Double rating, Double costInEuros) {
    this.title = title;
    this.author = author;
    this.year = year;
    this.copiesSoldInMillions = copiesSoldInMillions;
    this.rating = rating;
    this.costInEuros = costInEuros;
  }

  public String getAuthor() {
    return author;
  }

  public Double getRating() {
    return rating;
  }

  @Override
  public String toString() {
    return "Book{" +
      "title='" + title + '\'' +
      ", author='" + author + '\'' +
      ", year=" + year +
      ", copiesSoldInMillions=" + copiesSoldInMillions +
      ", rating=" + rating +
      ", costInEuros=" + costInEuros +
      '}';
  }
}

BookDatabaseダミーデータインジェクション用の別のクラス。

import java.util.Arrays;
import java.util.List;

public class BookDatabase {
  public static List<Book> getAllBooks() {
    return Arrays.asList(
      new Book("Don Quixote", "Miguel de Cervantes", 1605, 500, 3.9, 9.99),
      new Book("A Tale of Two Cities", "Charles Dickens", 1859, 200, 3.9, 10.0),
      new Book("The Lord of the Rings", "J.R.R. Tolkien", 2001, 150, 4.0, 12.50),
      new Book("The Little Prince", "Antoine de Saint-Exupery", 2016, 142, 4.4, 5.0),
      new Book("The Dream of the Red Chamber", "Cao Xueqin", 1791, 100, 4.2, 10.0)
    );
  }
}

そして最後に、各オブジェクトBookApplicationで宣言型プログラミングまたは不変性を実行するクラスを終了します。book

import java.util.List;

public class BookApplication {
  public static void main(String[] args) {
    List<Book> books = BookDatabase.getAllBooks();

    books.stream()
      .filter(book -> book.getRating() >= 4)
      .map(Book::getAuthor)
      .forEach(System.out::println);
  }
}

出力:

J.R.R. Tolkien
Antoine de Saint-Exupery
Cao Xueqin

上記の例では、Bookオブジェクトのリストがあります。

  1. .stream(...)オブジェクトのリストをBookオブジェクトのストリームに変換するために適用しました。
  2. 述語.filter(...)取り、フィルタリングされたオブジェクトのストリームを取得する2つの中間操作を適用しました。.map(...)
  3. .forEach(...)すべてのオブジェクトを印刷するために終了しました。

#デメリット

  1. ストリームが適切に処理されない場合、パフォーマンスに大きな影響を与えます。
  2. 学習曲線は時間がかかります。学習する必要のある過負荷の方法がたくさんあるため、混乱を招きますが、欠点ではありませんが、ここでは欠点として残しておきたいと考えています。

ソース:https ://hackernoon.com/have-you-used-the-streams-api-in-java

#java #stream #api