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

标签 java-8 java-stream

在 ruby​​ 中你可以做这样的事情

a = ["a", "b", "c"]
a.cycle {|x| puts x }  # print, a, b, c, a, b, c,.. forever.
a.cycle(2) {|x| puts x }  # print, a, b, c, a, b, c.

这真是太美了。

Java 8 中最接近的模拟是这样的:

Stream<Integer> iterator = Stream.iterate(new int[] {0, 0}, p -> new int[]{p[0] + 1, (p[0] + 1) % 2}).map(el -> el[1]);
Iterator<Integer> 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[] 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);

分别
Stream.generate(() -> null).limit(2)
      .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);

关于java-8 - 在 Java 8 中创建循环和无限范围整数的最惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49283335/

相关文章:

JavaFX:将列表绑定(bind)到另一个列表元素的成员属性

java - 如何处理流的流?

java - 使用 Stream <String> stream = Arrays.stream(words) 过滤唯一字数;

foreach - 对流的操作产生结果,但不修改其底层数据源

java - 如何使用 java 8 Stream API 将特定对象移动到列表的开头?

java - 从文件中读取值并在 Java 中使用流将它们拆分为两个列表

java - 使用java并行流在非同步ArrayList中添加元素

java - 使用流 API 设置字符串全部小写但首字母大写

java - 如果可选 boolean 值为真,如何执行操作?

java - 如何在上述情况下使用 Java 8 Optional?