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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值