2017-04-09 25 views
6

Tôi muốn tìm xem liệu một chuỗi các chuỗi có ít nhất một lần xuất hiện của một số khác String trong một Set<String> hay không. Tôi đã đưa ra hai giải pháp.Dòng Java: filter(). Count() vs anyMatch()

Hiệu suất khôn ngoan, cách tiếp cận nào là tốt nhất/được đề xuất?

1)

return source.stream().filter(this::streamFilter).count() > 0; 

2)

return source.stream().anyMatch(this::streamFilter); 

Dưới đây là phương pháp streamFilter:

private boolean streamFilter(String str) { 
    return filterKeywords.contains(str.toLowerCase()); 
} 

filterKeywords: private Set<String> filterKeywords;

Hoặc là có ap tốt hơn proach hơn thế này?

+3

# 2 vì nó dừng tìm kiếm khi kết quả là dứt khoát. Như javadoc nói: * Đây là một [** ngắn mạch ** hoạt động thiết bị đầu cuối] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html #StreamOps). * – Andreas

+0

@Andreas Tôi cũng nghĩ như vậy, muốn chắc chắn :) – dazito

+0

Xem [Là Java 8 findFirst(). IsPresent() hiệu quả hơn đếm()> 0?] (Https://stackoverflow.com/q/39713964/2711488) – Holger

Trả lời

11

Bạn nên sử dụng anyMatch(this::streamFilter), nhìn vào API vào phương pháp anyMatch dưới đây (tôi nhấn mạnh) như nó sẽ không đánh giá tất cả các yếu tố của con suối nơi như count() rõ ràng lặp toàn bộ dòng của các yếu tố.

Trả về xem bất kỳ yếu tố nào của luồng này có khớp với thuộc tính được cung cấp không. Có thể không đánh giá vị từ trên tất cả các thành phần nếu không cần thiết để xác định kết quả. Nếu luồng trống thì sai được trả về và vị từ không được đánh giá.

Vấn đề là một số phương pháp dòng như findFirst(), anyMatch(), findAny(), vv .. thực hiện ngắn circuiting hoạt động tức là, họ không đánh giá tất cả các yếu tố của dòng và bạn có thể tham khảo here cho biết thêm chi tiết .

1

anyMatch không phải lúc nào cũng thực thi tất cả luồng. Đó là cách tiếp cận tốt nhất.