Java Stream API示例可generate infinite stream的数据/元素generate infinite stream 。 我们将使用Stream.generate()和Stream.iterate()方法来获取无限流。创建无限流是中间操作,因此直到执行管道的终端操作后才开始创建元素。
1. Stream.iterate()
1.1. Syntaxstatic Stream iterate(T seed, UnaryOperator f)
它返回无限的顺序有序流 。 Stream中的第一个元素(位置0)将是提供的seed 。 对于n > 0 ,位于位置n的元素将是对位于位置n - 1的元素应用函数f的结果。
1.2. Infinite IntStream example
在给定的示例中,我们正在创建一个从0开始的无限偶数流。 然后,我们从流中收集了前10个元素,并将它们收集到一个列表中。List ints = IntStream.iterate(0, i -> i + 2)
.mapToObj(Integer::valueOf)
.limit(10)
.collect(Collectors.toList());
System.out.println(ints);
Program output[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
2. Stream.iterate()
2.1. Syntaxstatic Stream generate(Supplier s)
它返回无限顺序无序流 ,其中每个元素由提供的Supplier生成。 这适用于生成恒定流,随机元素流等。
然后可以在流链中调用
2.2. Infinite stream of random numbers
下面的示例创建一个介于0和99之间的10个随机数的流。
List randomNumbers = Stream.generate(() -> (new Random()).nextInt(100))
.limit(10)
.collect(Collectors.toList());
System.out.println(randomNumbers);
Program output[26, 68, 0, 31, 8, 88, 35, 53, 98, 92]
2.3. Infinite stream of custom objects
以下示例创建了无限的员工流,并从流中抽取了前5名员工。List employees = Stream.generate(Employee::create)
.limit(5)
.collect(Collectors.toList());
System.out.println(employees);
Program output[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中创建无限流的问题。
Reference :