Java无限 Stream

Java Stream API示例可生成无限的数据/元素 Stream 。我们将使用Stream.generate()Stream.iterate()方法来获取无限 Stream 。

创建无限 Stream 是中间操作,因此直到执行管道的终端操作后才开始创建元素。

1。 Stream.iterate()

1.1。句法

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

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

1.2。无限IntStream示例

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

List<Integer> ints = IntStream.iterate(0, i -> i + 2)
						.mapToObj(Integer::valueOf)
						.limit(10)
						.collect(Collectors.toList());

System.out.println(ints);

程序输出

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

2。 Stream.iterate()

2.1。句法

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

它返回无限的顺序无序 Stream ,其中每个元素都是由提供的生成的Supplier。这适用于生成恒定 Stream ,随机元素 Stream 等。

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

2.2。无限的随机数 Stream

下面的示例创建一个介于0和99之间的10个随机数的 Stream 。

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

System.out.println(randomNumbers);

程序输出

[26, 68, 0, 31, 8, 88, 35, 53, 98, 92]

2.3。无限的自定义对象 Stream

以下示例创建了无限的员工 Stream ,并从 Stream 中抽取了前5名员工。

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

System.out.println(employees);

程序输出

[Employee [id=-1631654733, name=, salary=0.0], 
Employee [id=-398548285, name=, salary=0.0], 
Employee [id=-649748457, name=, salary=0.0], 
Employee [id=-779124834, name=, salary=0.0], 
Employee [id=-868491671, name=, salary=0.0]]

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;
	}
}

请问您有关在Java 8中创建无限 Stream 的问题。

参考:

Java Stream接口

saigon has written 1445 articles

Leave a Reply