Java 如何形成包含从0到n的数字的字符串

Java 如何形成包含从0到n的数字的字符串,java,string,java-stream,Java,String,Java Stream,例如,当n=5时,我需要生成一个字符串“012345” 我可以通过运行一个从0到n的for循环并在字符串中添加数字来实现 for(int i = 0; i <= n; i++) { s += i; } 对于(inti=0;i使用IntStream和StringBuilder: int n = 5; String string = IntStream.rangeClosed(0, n) .collect(StringBuilder::new, StringBuilder:

例如,当
n=5
时,我需要生成一个字符串
“012345”

我可以通过运行一个从
0
n
for
循环并在字符串中添加数字来实现

for(int i = 0; i <= n; i++) {
    s += i;
}

对于(inti=0;i使用
IntStream
StringBuilder

int n = 5;
String string = IntStream.rangeClosed(0, n)
     .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
     .toString();

然而,对于这种特殊情况,最好在
StringBuilder

中使用for循环,我认为最好的方法是在您的问题中使用循环的方式。阅读评论,这似乎是普遍的共识。在一篇文章中指出,解决方案可以使用
StringBuilder
instead:

StringBuilder s=new StringBuilder();
for(int i=0;i alternativeWayA[0]=alternativeWayA[0]+i);

一览无余

您可以使用
collect(Collectors.joining())
并具有相同的输出

在另一个


嗯,您可以在调用
collect
之前使用
boxed

String alternativeWayB=IntStream.rangeClosed(0,n)
.boxed()
.map(i->i.toString())
.collect(收集器。连接(“”);
…如果喜欢使用
减少
而不是
收集器。加入

String alternativeWayC=IntStream.rangeClosed(0,n)
.boxed()
.map(i->i.toString())
.reduce(“,字符串::concat);
…或如本文所示

您需要
mapToObj
,因为此收集器不适用于
IntStream

String alternativeWayD=IntStream.rangeClosed(0,n)
.mapToObj(i->String.valueOf(i))
.collect(收集器。连接(“”);

贴上


String String=新字符串(IntStream.rangeClosed('1','1'+n).toArray(),0,n);

我认为它非常优雅,适用于
n<10
。对于
n=15
,结果变成
0123456789:;?
,因为它使用了字符的整数值。我在
字符串的最后一个参数中添加了
+1

stringalternativewaye=新字符串(IntStream.rangeClosed('0','0'+n).toArray(),0,n+1);

您可以使用
collect(Collectors.joining())
并且有相同的输出。好的,你可以在调用
collect
@WJS之前使用
boxed
。注意标记是,问题可能是更大问题的一部分,其中流是合理的。虽然我同意for循环更适合特定情况,但我找不到理由说服OP它是唯一正确的解决方案选项。此外,OP可能只是想了解和探索流AP的可能性。我可以添加一个关于for循环方法的注释,该方法显然更适合此特定情况,但我仍然不理解否决投票背后的原因。无论如何,感谢您的评论。
String String=new String(IntStream.rangeClosed('1','1'+n).toArray(),0,n);
您不应该期望新构造的字符串出现在池中。这也适用于您的方法的结果(以及在
StringBuilder
上调用
toString
的任何结果)。因为将字符串放入池中是一个昂贵的操作,这并不是一个缺点。唯一保证被池化的字符串是编译时常量和调用
intern()
的结果(但后者应该明智地使用,正如所说,添加到池中并不便宜).使用更简单的数字。0到n个数字或0到9个包含在内的数字。(即最多10个字符)?
String s=“”;用于(int i=0;iI同意streams是一种较差的方法。但是您应该使用StringBuilder。@WJS true。但是直到Java 8 StringBuilder在字符串上使用
+=
时才在内部使用。在Java的较新版本中,这一点发生了变化,以获得一种更好的机制,我忘记了它的名称…(另请参阅关于该主题的)@Matthieu编译器生成的代码是否使用
StringBuilder
或其他技术并不重要。重要的是,循环中的
+=
将在每次迭代中创建一个完整的
字符串,导致O(n²)您应该避免的时间复杂性。无论Java版本如何,编译器都不会转换循环。请看,就在您链接的循环的正下方。一个很好的摘要!最后,使用
StringBuilder
的for循环对我来说是最好的:)使用+1指出副作用。@NikolasCharalambidis是的,当然:)不过,我不愿意补充这一点,因为问题是寻找一个流实现。我觉得指出这一点没有错。但是,关于标记,[java Stream]的答案应该是存在的(当然,如果这种解决方案是可能的),并提供其他方法来改善情况(在这种简单的情况下是for循环)。