1. 概要

Java 8では、宣言型の方法でデータを処理できる新しい StreamAPIが導入されました。

このクイック記事では、 Stream APIを使用して、コンマ区切りのStringStringsのリストに分割する方法とを結合する方法を学習します。 X166X]String配列をコンマ区切りのStringに変換します。

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

ほとんどの場合、 Javaコレクションを反復処理し、フィルタリングロジックに基づいてコレクションをフィルタリングする必要がある状況に直面します。 このタイプの状況に対する従来のアプローチでは、多くのループとif-else操作を使用して目的の結果を取得します。

Stream APIについて詳しく知りたい場合は、この記事を確認してください。

2. StreamAPIを使用した文字列の結合

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. 文字列StreamAPIで分割

次に、 Stream APIを使用して、カンマ区切りのStringStringのリストに分割する関数を作成しましょう。

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

Stream APIを使用して、StringCharacterリストに直接変換することもできます。

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

ここで注意すべき興味深い事実の1つは、 chars()メソッドがStringIntegerのストリームに変換することです。すべてのCharシーケンスのASCII値。 そのため、 mapToObj()メソッドでマッパーオブジェクトを明示的に型キャストする必要があります。

4. String Array to Map With Stream API

String配列をsplitおよびCollectors.toMapを使用してマップに変換することもできます。ただし、配列内の各アイテムに、区切り文字で連結されたキー値エンティティが含まれている必要があります。 :

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]));
}

ここで、“:” は、文字列配列内のすべての要素のキーと値の区切り文字です。

コンパイルエラーを回避するために、コードがJava1.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は、高度なデータ処理技術を提供します。 この新しいコードの記述方法は、マルチスレッド環境でのヒープメモリ管理の点で非常に効率的です。

いつものように、完全なソースコードはGithub利用できます。