2012-01-24 14 views

risposta

16

Partenza Iterables classe Guava s' e la sua any() attuazione.

Più o meno la stessa cosa come l'esempio Commons Collezioni nel altra risposta, ma 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 mancanza di generici è un grosso svantaggio delle collezioni di beni comuni. –

+0

@ Anony-Mousse Sì; è un dolore, anche se lo uso ancora:/ –

+0

Questo è grandioso, grazie! – Zugwalt

0

Java non ha questa funzione integrata. Javascript's some() accetta un puntatore a funzione come argomento, che non è qualcosa supportato nativamente in Java. Ma dovrebbe essere abbastanza semplice emulare la funzionalità di some() in Java utilizzando un ciclo e un'interfaccia per la funzionalità di callback.

4

È possibile utilizzare CollectionUtils da Apache commons-collections:

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

Dove even è un predicato:

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

o in una versione 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ì, è è brutto per due ragioni:

  1. Java non supporta (ancora) funzioni come cittadini di prima classe, che sono emulati con l'interfaccia Metodo singolo-astratto.
  2. commons-collections non supporta i generici.

D'altro canto in lingue moderne JVM come Scala si può scrivere:

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

Un'altra libreria di terze parti per supportare questo metodo è Google Guava, ha [ 'Iterables.any () '] (http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/collect/Iterables.html). – axtavt

+2

E Guava supporta i generici. ;) –

+0

Java 8 avrà lambda. Inoltre, le classi SAM ora sono chiamate interfacce funzionali. –

Problemi correlati