更多: zhilu jiaocheng

使用 Stream.generate()

语法

static <T> Stream<T> generate(Supplier<T> s)

它返回一个无限连续的无序流,其中每个元素都由提供的 Supplier生成。
这适用于生成恒定流、随机元素流等。

然后可以在流链中调用limit()方法以在一定数量的元素后停止系列。

生成无限的随机数流示例

以下示例创建了一个由 0 到 99 之间的 10 个随机数组成的流。

List<Integer> randomNumbers = Stream.generate(() -> (new Random()).nextInt(100))
									.limit(10)
									.collect(Collectors.toList());
System.out.println(randomNumbers);

生成无限的自定义对象流

创建一个无限的Employee对象流,并获取其中5个。

List<Employee> employees = Stream.generate(Employee::create)
							.limit(5)
							.collect(Collectors.toList());
System.out.println(employees);

Employee类定义:

import java.io.Serializable;
import java.util.Random;
public class Employee implements Serializable {
	private static final long serialVersionUID = 1L;
	private static final Random r = new Random(Integer.MAX_VALUE);  
	private long id;
	private String name;
	private double salary;
	public Employee(long id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
	//Getters and setters
	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}

	public static Employee create() {
		//Get the employee id in more predictable manner
		//e.g. Max id present in databse + 1
		Employee obj = new Employee(r.nextInt(), "", 0.0d);
		return obj;
	}
}

使用 Stream.iterate()

语法

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

它返回一个无限顺序有序流。
Stream 中的第一个元素(位置 0)将是提供的 seed
对于 n &gt; 0,位置 n 的元素将是将函数 f应用于位置 n 1的元素的结果。

Java 生成 IntStream 示例

在给定的示例中,我们正在创建一个无限的偶数流,从 0开始。
然后我们从流中收集前 10 个元素并将它们收集到一个列表中。

List<Integer> ints = IntStream.iterate(0, i -> i + 2)
						.mapToObj(Integer::valueOf)
						.limit(10)
						.collect(Collectors.toList());
System.out.println(ints);
Java 如何生成无限数据流
日期:2020-09-17 00:10:03 来源:oir作者:oir