Java 8 在Java8中创建循环整数和无限范围整数的最惯用方法
在ruby中,您可以执行类似的操作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
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);