2008-12-12 10 views

Respuesta

44

Iterable<String> es el equivalente de IEnumerable<string> .

Sería una rareza en el sistema de tipos si las matrices implementadas Iterable. String[] es una instancia de Object[], pero Iterable<String> no es Iterable<Object>. Las clases y las interfaces no pueden multiplicar implementan la misma interfaz genérica con diferentes argumentos genéricos.

String[] funcionará igual que Iterable en el bucle for mejorado.

String[] puede ser fácilmente convertido en un Iterable:

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

Prefiero colecciones más de arrays (para los no primitivas de todos modos). Las matrices de tipos de referencia son un poco raras, y rara vez se necesitan desde Java 1.5.

+2

Para obtener más información sobre _por qué_ no se puede convertir entre Iterable y Iterable , echa un vistazo a [covarianza y contravarianza] (http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29). –

+0

Bien, ahora vamos a abordar el gorila de 500 libras en la habitación. ¿Cómo se usa 'Iterable '? - ¿Cuál es la declaración equivalente de 'yield return' en Java? – BrainSlugs83

+0

@ BrainSlugs83 Creo que esa es una pregunta diferente. –

8

¿Está buscando una Iterable<String>?

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

Creo que el equivalente de Java es Iterable<String>. Aunque String[] no implementa ella, puede iterar sobre los elementos de todas formas:

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

Si realmente necesita algo que implementa Iterable<String>, usted puede hacer esto:

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

Iterable<T> está bien, pero hay un pequeño problema. No se puede usar fácilmente en stream(), es decir, expresiones lambda.

Si lo desea, debe obtener su spliterator y utilizar la clase StreamSupport().