2012-01-24 19 views

Trả lời

16

Check-out Iterables lớp Guava 's và any() thực hiện.

Ít nhiều điều tương tự như ví dụ Commons Bộ sưu tập trong câu trả lời khác, nhưng genericized:

List<String> strings = Arrays.asList("ohai", "wat", "fuuuu", "kthxbai"); 
boolean well = Iterables.any(strings, new Predicate<String>() { 
    @Override public boolean apply(@Nullable String s) { 
     return s.equalsIgnoreCase("fuuuu"); 
    } 
}); 
System.out.printf("Do any match? %s%n", well ? "Yep" : "Nope"); 
+3

+1 Việc thiếu generics là một nhược điểm chính của bộ sưu tập commons. –

+0

@ Anony-Mousse Yeah; đó là một nỗi đau, mặc dù tôi vẫn sử dụng nó:/ –

+0

Điều này thật tuyệt vời, cảm ơn! – Zugwalt

0

Java không tích hợp tính năng này. Javascript's some() chấp nhận một con trỏ hàm làm đối số, không phải là một cái gì đó được hỗ trợ nguyên bản trong Java. Nhưng nó phải được khá thẳng về phía trước để mô phỏng các chức năng của some() trong Java bằng cách sử dụng một vòng lặp và và một giao diện cho các chức năng gọi lại.

4

Bạn có thể sử dụng CollectionUtils từ Apache commons-collections:

List<Integer> primes = Arrays.asList(3, 5, 7, 11, 13) 
CollectionUtils.exists(primes, even); //false 

đâu even là một vị từ:

Predicate even = new Predicate() { 
    public boolean evaluate(Object object) { 
     return ((Integer)object) % 2 == 0; 
    } 
} 

Hoặc trong một phiên bản inlined:

List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13) 
CollectionUtils.exists(primes, new Predicate() { 
    public boolean evaluate(Object object) { 
     return ((Integer)object) % 2 == 0; 
    } 
}); 

Vâng, nó xấu xí cho hai lý do:

  1. Java chưa hỗ trợ chức năng như công dân hạng nhất, được mô phỏng bằng giao diện Single-Abstract-Method.
  2. commons-collections không hỗ trợ Generics.

Mặt khác bằng các ngôn ngữ JVM hiện đại như Scala bạn có thể viết:

List(3,5,7,11,13,17).exists(_ % 2 == 0) 
+3

Một thư viện của bên thứ ba để hỗ trợ phương pháp này là Google ổi, nó có [ 'Iterables.any () '] (http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/collect/Iterables.html). – axtavt

+2

Và ổi hỗ trợ Generics. ;) –

+0

Java 8 sẽ có lambdas. Ngoài ra, các lớp SAM bây giờ được gọi là các giao diện chức năng. –

Các vấn đề liên quan