2012-01-24 19 views

Respuesta

16

Salida Iterables clase Guava 's y su aplicación any().

Más o menos lo mismo que el ejemplo Commons Colecciones en la otra respuesta, pero 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 La falta de genéricos es un inconveniente importante de las colecciones de los comunes. –

+0

@ Anony-Mousse Sí; es un dolor, aunque todavía lo uso también:/ –

+0

¡Esto es genial, gracias! – Zugwalt

0

Java no tiene esta función incorporada. Javascript's some() acepta un puntero a la función como argumento, que no es algo que sea compatible nativamente en Java. Pero debería ser bastante sencillo emular la funcionalidad de some() en Java utilizando un bucle y una interfaz para la funcionalidad de devolución de llamada.

4

Puede utilizar CollectionUtils de Apache commons-collections:

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

Dónde even es un predicado:

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

o en una versión inline:

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; 
    } 
}); 

Sí, es feo para dos razones:

  1. Java no (todavía) admite funciones como ciudadanos de primera clase, que se emulan con la interfaz Single-Abstract-Method.
  2. commons-collections no es compatible con los genéricos.

Por otro lado, en los idiomas modernos como JVM Scala puede escribir:

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

Otra biblioteca de terceros para apoyar este método es Google guayaba, tiene [ 'Iterables.any () '] (http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/collect/Iterables.html). – axtavt

+2

Y la guayaba es compatible con los genéricos. ;) –

+0

Java 8 tendrá lambdas. Además, las clases SAM ahora se llaman interfaces funcionales. –

Cuestiones relacionadas