如何使用Java8 Stream API按字符交替拼接两个字符串?
使用Java 8 Stream API实现字符串交替拼接
要实现两个字符串交替取字符、剩余字符追加的需求,可以通过合并两个Stream来完成,具体实现如下:
核心代码
import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; public class AlternateStringJoin { public static void main(String[] args) { String s1 = "Mohan"; String s2 = "1234567"; int minLen = Math.min(s1.length(), s2.length()); int maxLen = Math.max(s1.length(), s2.length()); String result = Stream.concat( // 处理交替拼接部分:遍历到较短字符串的长度,每个索引取出两个字符展开 IntStream.range(0, minLen) .boxed() .flatMap(i -> Stream.of(s1.charAt(i), s2.charAt(i))), // 处理剩余字符部分:遍历剩余索引,取出较长字符串的剩余字符 IntStream.range(minLen, maxLen) .mapToObj(i -> i < s1.length() ? s1.charAt(i) : s2.charAt(i)) ) .map(String::valueOf) .collect(Collectors.joining()); System.out.println("\"" + result + "\""); // 输出:"M1o2h3a4n567" } }
代码说明
- 确定长度边界:先计算两个字符串的最短长度
minLen(控制交替拼接的范围)和最长长度maxLen(控制剩余字符的范围)。 - 生成交替字符流:通过
IntStream.range(0, minLen)生成索引流,每个索引对应取出s1和s2的字符,再用flatMap将每个索引对应的两个字符展开为连续的流元素,实现交替顺序。 - 生成剩余字符流:生成从
minLen到maxLen-1的索引流,判断当前索引属于哪个未用完的字符串,取出对应的剩余字符。 - 合并与收集结果:用
Stream.concat合并两个流,将每个字符转为字符串后,通过Collectors.joining()拼接成最终结果。
性能优化版本(减少装箱开销)
如果追求更高执行效率,可以直接操作字符的int值,避免自动装箱:
String result = Stream.concat( IntStream.range(0, minLen) .flatMap(i -> IntStream.of(s1.charAt(i), s2.charAt(i))) .mapToObj(c -> String.valueOf((char) c)), IntStream.range(minLen, maxLen) .map(i -> i < s1.length() ? s1.charAt(i) : s2.charAt(i)) .mapToObj(c -> String.valueOf((char) c)) ) .collect(Collectors.joining());
内容的提问来源于stack exchange,提问作者Bijaya Bhaskar Swain
相关产品推荐
相关产品推荐

