Skip to main content
 首页 » 编程设计

java 流处理字符串

2022年07月19日144bjzhanghao

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为我们提供了灵活的数据处理方式,多线程环境中有效提升堆内存管理。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/82828357
阅读延展