java 8 流处理字符串

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 split(String str){
    return Stream.of(str.split(","))
      .map (elem -> new String(elem))
      .collect(Collectors.toList());
}

也可以直接转换字符串至字符列表:

public static List 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 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 expectation = new ArrayList<>();
    expectation.add("java");
    expectation.add("python");
    expectation.add("nodejs");
    expectation.add("ruby");
 
    List 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 expectation=new HashMap<>();
    expectation.put("language", "java");
    expectation.put("os", "linux");
    expectation.put("editor", "emacs");
     
    Map result = JoinerSplitter.arrayToMap(programming_languages);
    assertEquals(result, expectation);
     
}

其他测试用例,读者可以自己完成。

总结

Stream API为我们提供了灵活的数据处理方式,多线程环境中有效提升堆内存管理。

你可能感兴趣的:(java8~9核心功能)