2008-12-12 12 views

Antwort

44

Iterable<String> ist das Äquivalent von IEnumerable<string> .

Es wäre eine Sonderstellung im Typsystem, wenn Arrays implementiert Iterable. String[] ist eine Instanz von Object[], aber Iterable<String> ist keine Iterable<Object>. Klassen und Schnittstellen können nicht dieselbe generische Schnittstelle mit verschiedenen generischen Argumenten implementieren.

String[] funktioniert wie ein Iterable in der erweiterten For-Schleife.

String[] kann leicht in eine Iterable gedreht werden:

Iterable<String> strs = java.util.Arrays.asList(strArray); 

Bevorzugen Sammlungen über Arrays (für Nicht-Primitive sowieso). Arrays von Referenztypen sind ein bisschen seltsam und werden selten seit Java 1.5 benötigt.

+2

Für weitere Informationen über _why_ können Sie nicht zwischen Iterable werfen und Iterable Besuche [Kovarianz und Kontra] (http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29). –

+0

Okay, jetzt sprechen wir den 500-Pfund-Gorilla im Raum an. Wie benutzt du 'Iterable '? - Was ist die äquivalente "yield return" -Anweisung in Java? – BrainSlugs83

+0

@ BrainSlugs83 Ich denke, das ist eine andere Frage. –

8

Suchen Sie Iterable<String>?

Iterable<T> <=> IEnumerable<T> 
Iterator<T> <=> IEnumerator<T> 
2

Ich glaube, das Java-Äquivalent ist Iterable<String>. Obwohl String[] es nicht implementieren ist, können Sie eine Schleife über die Elemente trotzdem:

String[] strings = new String[]{"this", "that"}; 
for (String s : strings) { 
    // do something 
} 

Wenn Sie wirklich brauchen etwas, das Iterable<String> implementiert, können Sie dies tun:

String[] strings = new String[]{"this", "that"}; 
Iterable<String> stringIterable = Arrays.asList(strings); 
0

Iterable<T> ist OK, aber es gibt ein kleines Problem. Sie kann nicht einfach in stream(), d. H. Lambda-Ausdrücken, verwendet werden.

Wenn Sie möchten, sollten Sie den Spliterator verwenden und die Klasse StreamSupport() verwenden.