Java流的字符串操作

1.概述

Java 8引入了新的Stream API,該API使我們能夠以聲明的方式處理數據。

在這個快速文章中,我們將學習如何使用Stream API,以逗號分隔的分割String成列表Strings ,以及如何加入一個String數組一個逗號分隔String

我們還將研究如何使用Stream API將字符串數組轉換為映射。

幾乎所有時候,我們都面臨著需要迭代一些Java Collections併根據某些過濾邏輯對Collection進行過濾的情況。在針對這種情況的傳統方法中,我們將使用大量循環和if-else操作來獲得所需的結果。

如果您想了解有關Stream API的更多信息,請查看本文。

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

現在,讓我們創建一個功能,這將拆分逗號分隔String成列表String使用Stream API:

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流,其中每個Integer值表示每個Char序列的ASCII值。這就是為什麼我們需要在mapToObj()方法中顯式類型化mapper對象。

4.使用Stream API Map String數組

我們還可以使用splitCollectors.toMapString數組轉換為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);



 }

同樣,我們需要創建其餘的測試用例。

六,結論

Stream API為我們提供了複雜的數據處理技術。就多線程環境中的堆內存管理而言,這種新的代碼編寫方式非常有效。

像往常一樣,完整的源代碼可以在Github上找到