有很多方法可以做到这一点,但是使用Java 8流(可能是IntStream),如何生成一个长度为N的虚拟字符串?
我看过使用IntStream.range()和各种聚合函数(sum、average)的示例,但我没有找到一种方法来实现这一点。
我的第一个随机猜测看起来像这样:
IntStream.range(1, 110).map(i -> "x").collect(Collectors.joining());
但这种说法在几个方面都是错误的。
有很多方法可以做到这一点,但是使用Java 8流(可能是IntStream),如何生成一个长度为N的虚拟字符串?
我看过使用IntStream.range()和各种聚合函数(sum、average)的示例,但我没有找到一种方法来实现这一点。
我的第一个随机猜测看起来像这样:
IntStream.range(1, 110).map(i -> "x").collect(Collectors.joining());
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);
}
AAAAAA
,而不是AGCVT
。 - EugenemapToObj(Character::toString)
- undefined如果您真的想要使用Stream
进行此操作,可以利用Stream#generate
,并将其限制为n
个字符:
Stream.generate(() -> "x").limit(110).collect(Collectors.joining());
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
Strings#repeat
方法。 - EugeneArray.fill
,生成一个char[]
,然后简单地执行new String(char[])
... - Eugene