Java 8 在Java8中创建循环整数和无限范围整数的最惯用方法

Java 8 在Java8中创建循环整数和无限范围整数的最惯用方法,java-8,java-stream,Java 8,Java Stream,在ruby中,您可以执行类似的操作 a=[“a”、“b”、“c”] a、 循环{x{x}打印,a,b,c,a,b,c,。。永远。 a、 循环(2){| x | put x}#print,a,b,c,a,b,c。 这真是太美了 Java 8中最接近的模拟值如下: Stream iterator=Stream.iterate(newint[]{0,0},p->newint[]{p[0]+1,(p[0]+1)%2}).map(el->el[1]); 迭代器iter=Iterator.Iterator

在ruby中,您可以执行类似的操作

a=[“a”、“b”、“c”]
a、 循环{x{x}打印,a,b,c,a,b,c,。。永远。
a、 循环(2){| x | put x}#print,a,b,c,a,b,c。
这真是太美了

Java 8中最接近的模拟值如下:

Stream iterator=Stream.iterate(newint[]{0,0},p->newint[]{p[0]+1,(p[0]+1)%2}).map(el->el[1]);
迭代器iter=Iterator.Iterator();
System.out.println(iter.next())//0
System.out.println(iter.next())//1.
System.out.println(iter.next())//0
System.out.println(iter.next())//1.
有没有更好的方法和更惯用的Java语言

更新


我只想在这里概述一下,最接近我的问题的解决方案是

IntStream.generate(() -> max).flatMap(i -> IntStream.range(0, i)) 

多亏了@Hogler

如果您在流之外定义数组变量,那么就可以使用索引。你会有这样的感觉:

String[]数组={“a”、“b”、“c”};
Stream.iterate(0,i->(i+1)%array.length)
.map(i->数组[i])
.forEach(System.out::println);//永远打印a、b、c
Stream.iterate(0,i->(i+1)%array.length)
.map(i->数组[i])
.limit(2*array.length)
.forEach(System.out::println);//打印a、b、c两次
也可以使用您不需要使用
数组。长度

Collections.nCopies(2,数组).stream()
.flatMap(数组::流)
.forEach(System.out::println);//打印a、b、c两次
它显然比ruby版本长,但java通常是这样(更详细)

您可以使用它

String[] array = { "a", "b", "c" };
Stream.generate(() -> array).flatMap(Arrays::stream).forEach(System.out::println);
永远打印
a
b
c
,并且

String[] array = { "a", "b", "c" };
Stream.generate(() -> array).limit(2).flatMap(Arrays::stream).forEach(System.out::println);
a
b
c
打印两次

这甚至不需要现有阵列:

Stream.generate(() -> null)
      .flatMap(x -> Stream.of("a", "b", "c"))
      .forEach(System.out::println);
分别

你也可以使用

IntStream.range(0, 2).boxed()
      .flatMap(x -> Stream.of("a", "b", "c"))
      .forEach(System.out::println);

嗯,我打算用
flatMap
编辑我的答案。。。太晚了,我guess@holger稍加修改的问题:在一开始我只知道最大值,比如说,2,而寻源数组将是0,1。对于3,它将是0、1、2。通过这种方式,我可以先生成一个寻源数组,然后如您所指出的那样使用它。但也许有更好的方法?实际上,这是我最初的问题,你的意思是像
IntStream.generate(()->max).flatMap(i->IntStream.range(0,i))
Collections.nCopies(2,array).stream()
在当前实现中产生与
IntStream.range(0,2).mapToObj(i->array)
相同的结果。以防万一有人想知道…为什么相关?,
boxed()
使用
mapToObj(Integer::valueOf)
。如前所述,“以防万一有人想知道”。这意味着,这不是一件相关的事情,而是一件琐事。最有趣的是,您还可以使用等效的
IntStream.range(0,2).mapToObj(i->array)
。了解这两种变体可能有助于导出其他相关问题的解决方案。顺便说一句,在Java 9中,
boxed()
不再完全使用
mapToObj(Integer::valueOf)
,而是一个变量,它保持了对象被排序和区分的知识。好吧,我们都同意这一点是不相关的,我对
boxed()
的评论也是以类似的方式,以防有人需要知道。方法
nCopies
比使用
mapToObj
更“惯用”。关于java9仍然使用
mapToObj
只是它没有使用
NOT_SORTED
NOT_DISTINCT
标志,意思是排序和区分的(但同样只适用于排序或区分的流,而不是这个变体)。嗯,
IntStream.range(…).boxed()
是排序和区分的,但当然,随后的
flatMap
步骤将清除这些属性。你已经有了我的投票权,我无法再声明你已经展示了可行的替代方案。只想在这里概述一下,最接近我问题的解决方案是IntStream.generate(()->max.flatMap(I->IntStream.range(0,I)),感谢@Hogler
IntStream.range(0, 2).boxed()
      .flatMap(x -> Stream.of("a", "b", "c"))
      .forEach(System.out::println);