Javaストリームによる文字列操作

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]から入手可能です。