Tôi có một danh sách các phần tử, tôi cần tìm phần tử đầu tiên thỏa mãn điều kiện, sau đó thoát bằng cách sử dụng các luồng Java 8.Luồng đã sắp xếp() trước khi findFirst() không còn lười biếng
Tôi nghĩ rằng đoạn mã sau không may đánh giá tất cả các yếu tố có sẵn mà không những gì tôi cần, tôi cần phải đánh giá từng mục một và stop (break
) khi tìm ra trận đấu đầu tiên:
Tôi đang ở đây sắp xếp các các phần tử, sau đó ánh xạ phần tử đến thuộc tính url
của nó rồi cố gắng lọc nếu url
không rỗng hoặc rỗng sau đó tìm thấy kết quả phù hợp first
!
Arrays.stream(dataArray)
.sorted(Comparator.comparing(d -> d.getPriority()))
.peek(o -> System.out.println("SORT: " + o))
.map(d -> d.getOriginalURL(shortUrl))
.peek(o -> System.out.println("MAP: " + o))
.filter(u -> u != null && !u.isEmpty())
.peek(o -> System.out.println("FILTER: " + o))
.findFirst().orElse("");
Nhưng đầu ra cho thấy, tất cả các mục được evaulated ngay cả khi là người đầu tiên phù hợp với hoạt động if
điều kiện (filter
).
Data[] data = new Data[] { new ParseData(), new InMemoryData() };
System.out.println(">>> " + getOriginalURL(data, ""));
OUTPUT:
SORT: [email protected]
MAP: InMemory URL
FILTER: InMemory URL
SORT: [email protected]
MAP: Parse.com URL <<< THIS SHOULD NOT HAPPEN
FILTER: Parse.com URL <<< AND THIS TOO
>>> InMemory URL
như được thấy trong đầu ra, dòng không chỉ dừng lại khi bộ lọc phù hợp với các yếu tố đầu tiên, thay vào đó nó tiếp tục đánh giá các yếu tố thứ hai quá!
tôi muốn làm như thế này:
Arrays.sort(dataArray, Comparator.comparing(d -> d.getPriority())); // sort
for (Data data : dataArray) {
String url = data.getOriginalURL(shortUrl); // map
if (url != null && !url.isEmpty()) { // filter
System.out.println("url :" + url);
return url; // find first
}
}
Tôi đồng ý với bạn, đặc biệt nếu bất kỳ hoạt động nào trong số các hoạt động phát trực tuyến 'trung gian' là một hoạt động tốn kém. (trong câu hỏi của tôi, 'getOriginalURL' là một chi phí đắt tiền! –
Đúng, lỗi hiệu suất. Đã ghi lại [JDK-8042355] (https://bugs.openjdk.java.net/browse/JDK-8042355). –
@MuhammadHewedy Rất hay, Cảm ơn bạn đã nêu vấn đề này –