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
數組
我們還可以使用split
和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);
}
同樣,我們需要創建其餘的測試用例。
六,結論
Stream
API為我們提供了複雜的數據處理技術。就多線程環境中的堆內存管理而言,這種新的代碼編寫方式非常有效。
像往常一樣,完整的源代碼可以在Github上找到。