Ho una collezione e vorrei sapere se almeno un elemento soddisfa alcune condizioni. In sostanza, cosa fa some in JavaScript, mi piacerebbe fare su una collezione!c'è un equivalente Java al metodo "alcuni" di Javascript?
risposta
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");
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.
È 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:
- Java non supporta (ancora) funzioni come cittadini di prima classe, che sono emulati con l'interfaccia Metodo singolo-astratto.
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)
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
E Guava supporta i generici. ;) –
Java 8 avrà lambda. Inoltre, le classi SAM ora sono chiamate interfacce funzionali. –
+1 La mancanza di generici è un grosso svantaggio delle collezioni di beni comuni. –
@ Anony-Mousse Sì; è un dolore, anche se lo uso ancora:/ –
Questo è grandioso, grazie! – Zugwalt