Câu trả lời:
Lưu ý chữ ký của họ khác nhau như thế nào:
generate
mất một IntSupplier
, có nghĩa là bạn có nghĩa vụ phải tạo int mà không được cung cấp bất cứ điều gì. Ví dụ sử dụng bao gồm tạo một luồng không đổi có cùng số nguyên, tạo ra một luồng số nguyên ngẫu nhiên. Lưu ý cách mỗi phần tử trong luồng không phụ thuộc vào phần tử trước đó.
iterate
mất a seed
và a IntUnaryOperator
, có nghĩa là bạn phải tạo từng phần tử dựa trên phần tử trước đó . Điều này rất hữu ích để tạo ra một chuỗi xác định theo quy nạp, ví dụ. Trong trường hợp này, mỗi yếu tố được cho là phụ thuộc vào yếu tố trước .
IntStream.iterate
trả về một đơn đặt hàngIntStream
mặt khác IntStream.generate
trả về một thứ tự không có thứ tựIntStream
có thể giúp tăng tốc các đường ống dòng song song.
IntStream.generate
được ưu tiên để tạo các giá trị ngẫu nhiên hoặc không đổi như được chỉ định trong Javadoc, tôi đoán rất có thể các đặc tính của luồng được trả về.
Bên cạnh thứ tự, cách sử dụng cũng có một chút khác biệt. Hãy xem các chữ ký phương thức:
iterate(int seed, IntUnaryOperator f)
generate(IntSupplier s)
Iterate đã đưa ra giá trị bắt đầu rõ ràng dưới dạng tham số và toán tử đơn nguyên được sử dụng để tạo giá trị tiếp theo từ trước đó. Ở đây toán tử có thể dễ dàng bất biến mà không có trạng thái bên trong và có thể được sử dụng lại ở nhiều nơi song song mà không có vấn đề gì.
Tạo nhà cung cấp sử dụng. Những người này có thể cung cấp số không đổi hoặc ngẫu nhiên hoặc cần phải có trạng thái nội bộ để cung cấp chuỗi như (1, 2, 3, ...).