1概要

Java 8では、宣言的な方法でデータを処理できる新しい

Stream

APIが導入されました。

この簡単な記事では、

Stream

APIを使用して、カンマ区切りの

String



Strings

のリストに分割する方法と、

String

配列をカンマ区切りの

String

に結合する方法を学びます。

また、

Stream

APIを使用して文字列配列をマップに変換する方法についても説明します。

ほとんどいつも私達はいくつかの

Java Collections

を繰り返してそして何らかのフィルタリングロジックに基づいて

Collection

をフィルタリングする必要がある状況に直面します。この種の状況に対する伝統的なアプローチでは、望ましい結果を得るためにたくさんのループとif-else操作を使います。


Stream

APIの詳細については、リンク:/java-8-streamsを参照してください[この記事]。


2

Stream

APIを使用した文字列の結合


Stream

APIを使用して、

String

配列をカンマ区切りの

String

に結合する関数を作成します。

public static String join(String[]arrayOfString){
    return Arrays.asList(arrayOfString)
      .stream()
     //.map(...)
      .collect(Collectors.joining(","));
}

ここで注意すべき点:


  • stream()

    関数は任意の

    Collection

    を以下のストリームに変換します。

データ
**

map()

関数はデータを処理するために使用されます


  • filter()

    という名前の別の関数もあります。

フィルタリング基準

いくつかの固定されたプレフィックスとポストフィックスで

String

を結合したいというシナリオがあるかもしれません。

Stream

APIでは、次のようにしてそれを実行できます。

public static String joinWithPrefixPostfix(String[]arrayOfString){
    return Arrays.asList(arrayOfString)
      .stream()
     //.map(...)
      .collect(Collectors.joining(",","[","]"));
}


Collectors.joining()

メソッドでわかるように、プレフィックスを

[[]として、ポストフィックスを[]として宣言しています。したがって、生成された

String

は、宣言された

[…​..]__の形式で作成されます。


3

Stream

API

を使用した

Strings

の分割

それでは、

Stream

APIを使用して

String

のコンマ区切り

String

に分割する関数を作成しましょう。

public static List<String> split(String str){
    return Stream.of(str.split(","))
      .map (elem -> new String(elem))
      .collect(Collectors.toList());
}


Stream

APIを使用して

String



Character

リストに直接変換することもできます。

public static List<Character> splitToListOfChar(String str) {
    return str.chars()
      .mapToObj(item -> (char) item)
      .collect(Collectors.toList());
}

ここで注意すべき興味深い事実は、

chars()

メソッドが

String



Integer

のストリームに変換することです。そのため、

mapToObj()

メソッドでマッパーオブジェクトを明示的に型キャストする必要があります。

4.


_String


Map


with

Stream_

API

配列内の各項目に区切り文字で連結されたキーと値のエンティティが含まれている場合は、

__ split


and

Collectors.toMap

を使用して

String__配列をmapに変換することもできます。

public static Map<String, String> arrayToMap(String[]arrayOfString) {
    return Arrays.asList(arrayOfString)
      .stream()
      .map(str -> str.split(":"))
      .collect(toMap(str -> str[0], str -> str[1]));
}

ここで、

“:”

は、String配列内のすべての要素のキーと値の区切り記号です。

  • コンパイルエラーを避けるために、コードがJava 1.8 ** を使用してコンパイルされていることを確認する必要があることを忘れないでください。これを行うには、

    pom.xml

    に次のプラグインを追加する必要があります。

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
</build>


5テスト中

関数の作成は完了したので、結果を検証するためのテストケースを作成しましょう。

まず、簡単な結合方法をテストしましょう。

@Test
public void givenArray__transformedToStream__convertToString() {
    String[]programmingLanguages = {"java", "python", "nodejs", "ruby"};
    String expectation = "java,python,nodejs,ruby";

    String result  = JoinerSplitter.join(programmingLanguages);
    assertEquals(result, expectation);
}

次に、単純な分割機能をテストするために別のものを作成しましょう。

@Test
public void givenString__transformedToStream__convertToList() {
    String programmingLanguages = "java,python,nodejs,ruby";

    List<String> expectation = new ArrayList<>();
    expectation.add("java");
    expectation.add("python");
    expectation.add("nodejs");
    expectation.add("ruby");

    List<String> result  = JoinerSplitter.split(programmingLanguages);

    assertEquals(result, expectation);
}

最後に、機能をマップするために

String

配列をテストしましょう。

@Test
public void givenStringArray__transformedToStream__convertToMap() {

    String[]programming__languages = new String[]{"language:java","os:linux","editor:emacs"};

    Map<String,String> expectation=new HashMap<>();
    expectation.put("language", "java");
    expectation.put("os", "linux");
    expectation.put("editor", "emacs");

    Map<String, String> result = JoinerSplitter.arrayToMap(programming__languages);
    assertEquals(result, expectation);

}

同様に、残りのテストケースを作成する必要があります。


6. 結論


Stream

APIは高度なデータ処理技術を提供してくれます。

この新しいコード作成方法は、マルチスレッド環境でのヒープメモリ管理の点で非常に効率的です。

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