使用Java 8流生成一个长度为N的虚拟字符串

5

有很多方法可以做到这一点,但是使用Java 8流(可能是IntStream),如何生成一个长度为N的虚拟字符串?

我看过使用IntStream.range()和各种聚合函数(sum、average)的示例,但我没有找到一种方法来实现这一点。

我的第一个随机猜测看起来像这样:

IntStream.range(1, 110).map(i -> "x").collect(Collectors.joining());

但这种说法在几个方面都是错误的。

我会使用Guava来实现这个功能,使用Strings#repeat方法。 - Eugene
1
但这种做法有几个不同的错误。- 为什么? - Jacob G.
1
我认为最快的方法是在这里使用Array.fill,生成一个char[],然后简单地执行new String(char[])... - Eugene
@shmosel 虽然并行处理会很糟糕。 - Eugene
1
@Eugene 大多数并行代码都很糟糕。不确定你的观点是什么。 - shmosel
显示剩余4条评论
3个回答

7
你需要使用mapToObj()而不是map(),因为你实际上使用了一个IntStream,而IntStream.map()需要以参数形式提供IntUnaryOperator,即一个(int->int)函数。 对于相同字符的占位符(例如“x”):
collect = IntStream.range(1, 110)
                   .mapToObj(i ->"x")
                   .collect(Collectors.joining());

生成随机虚拟数据:

您可以使用Random.ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

返回一个流,产生给定streamSize数量的伪随机int值,每个值都符合给定的起点(包括)和边界(不包括)。

要生成一个包含10个ASCII码在65到100之间的随机字符的字符串:

public static void main(String[] args) {
    String collect = new Random().ints(10, 65, 101)
                                 .mapToObj(i -> String.valueOf((char) i))
                                 .collect(Collectors.joining());

    System.out.println(collect);

}

1
这不是随机的... - Eugene
@Eugene 你能详细说明一下吗? - davidxxx
1
Op想要的是AAAAAA,而不是AGCVT - Eugene
@Eugene 谢谢! - davidxxx
1
哦,哇! :) 真的吗?这就是 OP 所缺少的吗? - Eugene
在第二个例子中,你也可以使用mapToObj(Character::toString) - undefined

4

如果您真的想要使用Stream进行此操作,可以利用Stream#generate,并将其限制为n个字符:

Stream.generate(() -> "x").limit(110).collect(Collectors.joining());

2
您已经接近成功了:
String s = IntStream.range(40, 110)
                    .mapToObj(i -> Character.toString((char)i))
                    .collect(Collectors.joining());

System.out.println(s);

生成:

()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm

如果您希望随机排序,例如 N = 60
Random r = new Random();    

IntStream.generate(() -> 40 + r.nextInt(70))
         .limit(60)
         .mapToObj(i -> Character.toString((char)i))
         .collect(Collectors.joining()));

生成

Z>fA+5OY@:HfP;(L:^WKDU21T(*1//@V,F9O-SA2;+),A+V/mLjm<eaE56CH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接