Trong Java 8, phương thức iterate() của Stream API nhận seed (giá trị khởi tạo) và unary operator (toán tử đơn ngôi) làm tham số. Vì stream trở nên vô hạn, lập trình viên phải thêm điều kiện kết thúc tường minh (explicit termination conditions) bằng limit, findFirst, findAny, v.v. Trong Java 9, phương thức iterate() của Stream API thêm tham số mới: một predicate (điều kiện) dùng để dừng luồng.
Cú pháp
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
Ví dụ so sánh Java 8 và Java 9
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.List;
public class StreamIterateMethodTest {
public static void main(String args[]) {
List<Integer> numbers1 = Stream.iterate(1, i -> i+1) // 2 tham số
.limit(10)
.collect(Collectors.toList());
System.out.println("In Java 8:" + numbers1);
List<Integer> numbers2 = Stream.iterate(1, i -> i <= 10, i -> i+1) // 3 tham số
.collect(Collectors.toList());
System.out.println("In Java 9:" + numbers2);
}
}
Kết quả
In Java 8:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] In Java 9:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Java 9 cho phép dừng stream ngay trong iterate() nhờ predicate, không cần limit() riêng.