如何使用java8流API通过每个字符连接两个字符串?[复制]

How to concat two Strings by each character by using java8 stream API? [duplicate]

提问人:Bijaya Bhaskar Swain 提问时间:11/9/2023 最后编辑:Bijaya Bhaskar Swain 更新时间:11/9/2023 访问量:90

问:

我需要帮助解决这个问题,我有两个字符串

String s1 = "Mohan";
String s2 = "1234567";

我需要输出为

"M1o2h3a4n567"

就像 S1 第一个字符,然后是 S2 第一个字符。

如何使用 java8 流 API 解决这个问题?

我将两个字符串转换为一个列表,然后在流 API 中尝试使用 reduce,但我知道这不是正确的解决方案。

java-8 java-stream

评论

0赞 Bijaya Bhaskar Swain 11/9/2023
@haba713它没有给出预期的输出。
0赞 haba713 11/9/2023
对不起,我没有正确阅读问题。String result = IntStream.range(0, Math.max(s1.length(), s2.length())).mapToObj(i -> (i < s1.length() ? s1.charAt(i) + "" : "") + (i < s2.length() ? s2.charAt(i) + "" : "")).collect(Collectors.joining());

答:

1赞 MC Emperor 11/9/2023 #1

嗯,有很多选择,每个选项都有优点和缺点。

这是另一种方法,使用 an 和 a :IntStreamStringBuilder

String result = IntStream.range(0, Math.max(s1.length(), s2.length()))
    .collect(
            StringBuilder::new,
            (sb, i) -> {
                if (i < s1.length()) {
                    sb.append(s1.charAt(i));
                }
                if (i < s2.length()) {
                    sb.append(s2.charAt(i));
                }
            },
            StringBuilder::append
    )
    .toString();

这里发生的事情是,我们在两个字符串中最大的字符串的所有索引上循环(使用 )。IntStreammax(s1.length(), s2.length())

然后我们收集到 ,如果存在,则将字符从 添加,然后为 。StringBuilders1s2

请注意,此代码不使用任何中间子字符串。

但是,我认为 ol' skool for 或 foreach 循环与使用流一样好。