java 8 流处理字符串
java 8 引入新的Stream api,方便我们使用声明方式处理数据。本文我们将说明如何使用Stream api分割逗号分割字符串至list,以及如何连接字符串数组至逗号分割字符串,也会介绍如何使用Stream api转换字符串数组至map。
大多数情况下,我们会遇到需要迭代Java Collection并基于一些业务进行过滤的场景。使用传统方式实现需要使用大量循环和判断操作才能获得期望结果。
使用Stream api连接字符串
下面示例使用使用Stream api连接字符串数组至逗号分割的字符串:
public static String join(String[] arrayOfString){
return Arrays.asList(arrayOfString)
.stream()
//.map(...)
.collect(Collectors.joining(","));
}
代码关键说明:
- stream()函数转换任何Collection至流数据
- map()函数用于处理数据
- 还有filter()函数用于依据过滤条件过滤数据
有些场景,可能想连接字符串并使用前缀和后缀,使用stream api可以轻松实现:
public static String joinWithPrefixPostfix(String[] arrayOfString){
return Arrays.asList(arrayOfString)
.stream()
//.map(...)
.collect(Collectors.joining(",","[","]"));
}
我们看到Collectors.joining()方法,使用“[”作为前缀,“]”作为后缀,因此生成结果为[,]格式。
使用Stream api分割字符串
下面示例使用使用Stream api分割逗号分割字符串至list:
public static List<String> split(String str){
return Stream.of(str.split(","))
.map (elem -> new String(elem))
.collect(Collectors.toList());
}
也可以直接转换字符串至字符列表:
public static List<Character> splitToListOfChar(String str) {
return str.chars()
.mapToObj(item -> (char) item)
.collect(Collectors.toList());
}
需要说明的是chars()方法转换字符串至Integer流,每个Integer值代表字符序列的ASCII值。所以我们需要显示使用mapToObj()方法进行类型转换。
使用Stream api转换字符串数组至Map
使用split和Collector.toMap方法把数组每个元素转出key-value形式,最终输出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]));
}
测试
下面针对前面创建的函数进行测试并验证结果,首先测试简单的连接方法:
@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);
}
最后测试字符串数组转出map功能:
@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为我们提供了灵活的数据处理方式,多线程环境中有效提升堆内存管理。