1概要

Java 8の最もエキサイティングな機能の1つは次のリンクです。

__http://amaembo.github.io/streamex/javadoc/[StreamEx]は、標準のStream APIに追加の機能とパフォーマンスの向上を提供するライブラリです。

ここにいくつかのコア機能があります:

  • 日常的な作業を行うための短くて便利な方法

  • 元のJDKとの100%の互換性

  • 並列処理のしやすさ:新しい機能には

可能な限りパラレルストリームに有利
** パフォーマンスと最小限のオーバーヘッドもし

StreamEx

標準の__Streamに比べて少ないコードを使用してタスクを実行します。

このチュートリアルでは、

StreamEx

APIの機能のいくつかを紹介します。

** 2例の設定

**


StreamEx

を使用するには、

pom.xml

に次の依存関係を追加する必要があります。

<dependency>
    <groupId>one.util</groupId>
    <artifactId>streamex</artifactId>
    <version>0.6.5</version>
</dependency>

ライブラリの最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22one.util%22%20AND%20a%3A%22streamex%22[Mavenにあります中央]。

このチュートリアルでは、単純な

User

クラスを使用します。

public class User {
    int id;
    String name;
    Role role = new Role();

   //standard getters, setters, and constructors
}

そして単純な

Role

クラス:

public class Role {
}

** 3コレクターのショートカット方法

**


Streams

で最も一般的な端末操作の1つは

collect

操作です。これにより、

Stream

要素を私たちが選んだコレクションに再パッケージ化することができます。

問題は、単純なシナリオではコードが不必要に冗長になる可能性があることです。

users.stream()
  .map(User::getName)
  .collect(Collectors.toList());

3.1. コレクションに集める

現在、StreamExでは、

List



Set、Map、InmutableList、

etcが必要であることを指定するために

Collector

を提供する必要はありません。

List<String> userNames = StreamEx.of(users)
  .map(User::getName)
  .toList();


Stream

から要素を取り出してそれらをコレクションに入れるよりも複雑なことを実行したい場合は、

collect

操作をAPIで使用できます。

3.2. 高度なコレクター

もう1つの省略形は

groupingBy

です。

Map<Role, List<User>> role2users = StreamEx.of(users)
  .groupingBy(User::getRole);

これにより、メソッド参照で指定されたキータイプを持つ

Map

が生成され、SQLのgroup by操作に似たものが生成されます。

プレーンな

Stream

APIを使用して、次のように書く必要があります。

Map<Role, List<User>> role2users = users.stream()
  .collect(Collectors.groupingBy(User::getRole));

__Collectors.joining()についても、同様の省略形があります。

StreamEx.of(1, 2, 3)
  .joining("; ");//"1; 2; 3"

これは

Stream

aのすべての要素を取り、それらすべてを連結した

String

を生成します。


4要素の追加、削除、選択

いくつかのシナリオでは、** さまざまなタイプのオブジェクトのリストを取得したので、それらをタイプでフィルタリングする必要があります。

List usersAndRoles = Arrays.asList(new User(), new Role());
List<Role> roles = StreamEx.of(usersAndRoles)
  .select(Role.class)
  .toList();

  • この便利な操作で、




    Stream ** 、の先頭または末尾に要素を追加できます。

List<String> appendedUsers = StreamEx.of(users)
  .map(User::getName)
  .prepend("(none)")
  .append("LAST")
  .toList();


  • nonNull()

    ** を使用して不要なnull要素を削除し、

    Stream



    Iterable

    として使用できます。

for (String line : StreamEx.of(users).map(User::getName).nonNull()) {
    System.out.println(line);
}


5数学演算とプリミティブ型のサポート

この自己説明的な例でわかるように、

StreamEx

はプリミティブ型のサポートを追加します。

short[]src = {1,2,3};
char[]output = IntStreamEx.of(src)
  .map(x -> x **  5)
  .toCharArray();

それでは、

double

要素の配列を順番に並べてみましょう。各ペアの違いからなる配列を作りたいです。

この操作を実行するには、

pairMap

メソッドを使用します。

public double[]getDiffBetweenPairs(double... numbers) {
    return DoubleStreamEx.of(numbers)
      .pairMap((a, b) -> b - a)
      .toArray();
}

6.マップ操作

6.1. キーによるフィルタリング

もう1つの便利な機能は、

Map

から

Stream

を作成し、それらが指す値を使用して要素をフィルタ処理する機能です。

この場合、null以外のすべての値を取ります。

Map<String, Role> nameToRole = new HashMap<>();
nameToRole.put("first", new Role());
nameToRole.put("second", null);
Set<String> nonNullRoles = StreamEx.ofKeys(nameToRole, Objects::nonNull)
  .toSet();

6.2. キーと値のペアを操作する


EntryStream

インスタンスを作成してキーと値のペアを操作することもできます。

public Map<User, List<Role>> transformMap(
    Map<Role, List<User>> role2users) {
    Map<User, List<Role>> users2roles = EntryStream.of(role2users)
     .flatMapValues(List::stream)
     .invert()
     .grouping();
    return users2roles;
}

特別な操作

EntryStream.of

は、

Map

を受け取り、それをKey-Valueオブジェクトの

Stream

に変換します。次に、

flatMapValues

操作を使用して、ロールのリストを単一の値の

Stream

に変換します。

次に、

User

クラスをキー、

Role

クラスを値にして、キーと値のペアを__反転することができます。

そして最後に、

grouping

操作を使用して、マップを受信したマップの反転に変換できます。すべて4つの操作で済みます。

6.3. キーと値のマッピング

キーと値を独立してマッピングすることもできます。

Map<String, String> mapToString = EntryStream.of(users2roles)
  .mapKeys(String::valueOf)
  .mapValues(String::valueOf)
  .toMap();

これにより、キーや値を他の必要な型に素早く変換できます。


7. ファイル操作


StreamEx

を使用すると、ファイル全体を一度にロードすることなく、効率的にファイルを読み取ることができます。大きなファイルを処理するときに便利です。

StreamEx.ofLines(reader)
  .remove(String::isEmpty)
  .forEach(System.out::println);

空行を除外するために

remove()

メソッドを使用したことに注意してください。

ここで注意しなければならないのは、

StreamEx

が自動的にファイルを閉じるわけではないということです。したがって、不要なメモリオーバーヘッドを回避するために、ファイルの読み取りと書き込みの両方の機会に手動でクローズ操作を実行する必要があります。


8結論

このチュートリアルでは、

StreamEx

について学びました。さまざまなユーティリティがあります。まだまだたくさんのことがあります – そして、彼らは便利なチートシートhttps://github.com/amaembo/streamex/blob/master/CHEATSHEET.mdを参照してください

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries/src/main/java/com/baeldung/streamex[over on GitHub]から入手可能です。