Tôi muốn một chút mở rộng những gì assylias nói (mà là hoàn toàn chính xác).
Đầu tiên, các đặc điểm này được triển khai dưới dạng đơn giản int
, đây là biểu diễn nhị phân. Đầu tiên là tất cả các số 0, nhưng khi bạn thêm một đặc tính nhất định, bit đó được đặt thành one
qua thao tác OR
, bị xóa qua thao tác AND
.
Bạn có thể nhìn thấy nơi một tài sản nhất định Spliterator đặt one
nó chỉ đơn giản bằng cách làm này ví dụ:
System.out.println(Integer.toBinaryString(Spliterator.SIZED)); // 1000000
Nó thiết lập các bit 7-thứ vào một từ cánh phải. Vì vậy, khi bạn kiểm tra:
Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();
System.out.println((spliterator.characteristics() & Spliterator.SIZED) == Spliterator.SIZED);
Bạn đang thực sự kiểm tra nếu đặc biệt bit này được thiết lập.
Second
Có đặc điểm dòng được thiết lập như là kết quả của sự sáng tạo của bạn đầu tiên dòng (và không phải là hai). Hoặc là cuốn sách là một chút lỗi thời hoặc bạn đã không cho chúng ta thấy toàn bộ ví dụ:
Spliterator<Integer> spliterator = Stream.of(8, 3, 5, 6, 7, 4).spliterator();
System.out.println(Integer.bitCount(spliterator.characteristics())); // 4
System.out.println(Integer.toBinaryString(spliterator.characteristics()));// 100010001010000
Những bộ bit (tức là tương đương với one
) tương ứng với SIZED
, ORDERED
, IMMUTABLE
, SUBSIZED
.
Các thiết bị khác mà bạn đã hiển thị rõ ràng hơi bị tắt - bạn có thể tự mình kiểm tra.
Thứ ba
Những đặc điểm này là vô cùng quan trọng trong việc xử lý dòng.Một vài ví dụ:
long howMany = Stream.of(1, 2, 3).map(x -> {
System.out.println("mapping");
return x * 2;
}).count();
System.out.println(howMany); // 3
Trong java-9, bạn sẽ không nhìn thấy mapping
in, bởi vì bạn đã không thay đổi luồng (bạn chưa xóa các đặc trưng SIZED
); do đó không cần phải đánh giá bản đồ cả.
Stream<Integer> unlimited = Stream.iterate(0, x -> x + 1);
System.out.println(unlimited.spliterator().hasCharacteristics(Spliterator.SIZED));
Stream<Integer> limited = unlimited.limit(3);
System.out.println(limited.spliterator().hasCharacteristics(Spliterator.SIZED));
Bạn sẽ nghĩ rằng sản lượng nên được false true
- chúng tôi có thêm một limit
sau khi tất cả, nhưng không có; kết quả là false false
: không có tối ưu hóa như vậy được thực hiện, ngay cả khi không có nhiều ngăn chặn nó.
Không, tôi đã đưa ra toàn bộ đoạn trích. Có thể tôi đã có phiên bản cũ của cuốn sách. –
Ví dụ thứ ba (đoạn thứ hai), không jdk9 không quan tâm đến điều đó? –