การปรับปรุง iterate() ใน Java 9
Java 8: iterate(seed, unaryOperator) -> infinite stream ต้องใช้ limit/findFirst เพื่อหยุด
Java 9: เพิ่มพารามิเตอร์ Predicate (hasNext) เพื่อกำหนดเงื่อนไขหยุดโดยตรง
Syntax
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
ตัวอย่าง: Java 8 vs 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[]) {
// Java 8 - ต้องใช้ limit
List<Integer> numbers1 = Stream.iterate(1, i -> i+1)
.limit(10)
.collect(Collectors.toList());
System.out.println("In Java 8:" + numbers1);
// Java 9 - ใช้ predicate หยุดเอง
List<Integer> numbers2 = Stream.iterate(1, i -> i <= 10, i -> i+1)
.collect(Collectors.toList());
System.out.println("In Java 9:" + numbers2);
}
}
Output
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]
ประโยชน์
- เขียน stream ที่มีเงื่อนไขหยุดชัดเจน ไม่ต้อง limit
- โค้ดอ่านง่าย ใกล้เคียง for-loop แบบเดิม
- หลีกเลี่ยงการคำนวณเกินความจำเป็น
สรุป
iterate(seed, hasNext, next) ใน Java 9 ทำให้สร้าง finite stream จาก iteration ได้โดยตรงและเป็นธรรมชาติมากขึ้น