Java如何使用Stream API操作字符串 适用的Collectors方法是什么
问题根因
你现在的写法卡壳不是因为没选对Collectors的方法,而是流水线少了核心的转置聚合步骤:
- 执行
.map(st -> st.split(" "))之后,流里的元素是一个个String[]数组,此时不管调什么收集方法,都没法直接把数组里的元素按索引交叉拼起来,直接toList()只会得到List<String[]>,和你要的结果差很远。 - 你要的
[Hello Welcome, World America]本质是把拆分后的二维数组做转置:原来每个字符串拆出来的两个元素是行,现在要把第一列的两个元素拼起来当第一个结果,第二列的两个元素拼起来当第二个结果。
Java 8 可直接运行的实现
List<String> str = Arrays.asList("Hello World","Welcome America"); // 先把所有字符串按空格拆成数组 List<String[]> splitArrs = str.stream() .map(st -> st.split(" ")) .collect(Collectors.toList()); // 按索引遍历列,把同列的字符串拼起来 List<String> res = IntStream.range(0, splitArrs.get(0).length) .mapToObj(idx -> splitArrs.stream() .map(arr -> arr[idx]) .collect(Collectors.joining(" "))) .collect(Collectors.toList());
运行后res的结果就是你预期的[Hello Welcome, World America]。
用到的核心API
- 字符串拼接归集用
Collectors.joining(" "),这是Stream里专门做字符串拼接的收集器,传入的参数是元素之间的分隔符,比手动拼接字符串简洁很多。 - 索引遍历用
IntStream.range(起始值, 结束值)生成连续的int序列,用来代替普通for循环的索引计数,适配Stream的流水线写法。 - 注意:这个写法默认所有输入字符串拆分后的长度一致,如果你的实际业务里存在拆分后长度不一样的情况,要提前做长度校验或者补位,避免数组索引越界。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

