📜  Java中的 Stream iterate(T,Predicate,UnaryOperator) 方法及示例(1)

📅  最后修改于: 2023-12-03 14:42:52.056000             🧑  作者: Mango

Java中的 Stream iterate(T,Predicate,UnaryOperator) 方法及示例

Stream iterate() 方法是 Java 8 提供的一个流式API方法,它用于通过函数生成一组无限的有序元素。该方法可以接受三个参数,分别为起始元素、谓词和函数。其中,起始元素表示起始值,谓词表示终止条件,函数则循环生成下一个元素。通过这三个参数的组合,可以生成不同类型的序列。下面我们将详细讲解该方法的使用及示例。

方法签名
public static<T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
参数说明
  • seed: 起始元素
  • hasNext: 终止条件谓词,表示下一个元素是否存在
  • next: 产生下一个元素的函数
返回值

该方法会返回一个Stream对象,其中包含一组无限的有序元素。

使用示例

例如,我们可以通过 iterate() 方法生成一个从 0 开始的自然数序列:

Stream.iterate(0, i -> i + 1)
      .limit(10)
      .forEach(System.out::println);

输出结果为:

0
1
2
3
4
5
6
7
8
9

接下来,我们给出一个更加复杂的示例。在该示例中,我们使用 iterate() 方法和 filter() 方法生成了一个斐波那契数列:

Stream.iterate(new int[]{0,1}, arr -> new int[]{arr[1], arr[0]+arr[1]})
      .map(arr -> arr[0])
      .limit(10)
      .forEach(System.out::println);

斐波那契数列是指:第 n 项为前两项之和,其中第 0 项为 0,第 1 项为 1。因此,我们先将起始元素设置为 int[]{0,1},然后通过函数 arr -> new int[]{arr[1], arr[0]+arr[1]} 计算出下一个元素(即前两项之和)。最后,再通过 map() 方法取出第一个元素,即为所求的斐波那契数列。

输出结果为:

0
1
1
2
3
5
8
13
21
34
注意事项

使用 iterate() 方法时,需要注意以下几点:

  • 如果没有使用 limit() 方法对无限流进行限制,那么该流将无限循环下去,直到满足 hasNext 谓词为止;
  • 因为 iterate() 方法生成的流是无限的,因此需要注意及时停止循环,否则可能会造成内存溢出等问题;
  • 如果 hasNext 谓词恒为 true,那么由于流是无限的,程序将一直运行下去,直到达到内存极限为止。因此,需要谨慎使用 hasNext 谓词,以避免程序错误。