Java Arrays & Generics: Java-эквивалент C # - PullRequest
43 голосов
/ 12 декабря 2008

Так что в C # я могу трактовать string[] как IEnumerable<string>.

Есть ли эквивалент Java?

Ответы [ 5 ]

47 голосов
/ 14 декабря 2008

Iterable<String> является эквивалентом IEnumerable<string>.

Было бы странностью в системе типов, если массивы реализованы Iterable. String[] является экземпляром Object[], но Iterable<String> не является Iterable<Object>. Классы и интерфейсы не могут одновременно реализовывать один и тот же универсальный интерфейс с разными универсальными аргументами.

String[] будет работать так же, как Iterable в расширенном цикле for.

String[] можно легко превратить в Iterable:

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

Предпочитать коллекции массивам (в любом случае для не примитивов). Массивы ссылочных типов немного странные и редко нужны с Java 1.5.

8 голосов
/ 12 декабря 2008

Вы ищете Iterable<String>?

Iterable<T> <=> IEnumerable<T>
Iterator<T> <=> IEnumerator<T>
4 голосов
/ 12 декабря 2008

Iterable <T>

2 голосов
/ 12 декабря 2008

Я считаю, что Java-эквивалент Iterable<String>. Хотя String[] не реализует это, вы все равно можете зациклить элементы:

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

Если вам действительно нужно что-то, что реализует Iterable<String>, вы можете сделать это:

String[] strings = new String[]{"this", "that"};
Iterable<String> stringIterable = Arrays.asList(strings);
0 голосов
/ 04 февраля 2016

Iterable<T> в порядке, но есть небольшая проблема. Его нельзя легко использовать в stream() т.е. лямбда-выражениях.

Если вы хотите, вы должны получить его spliterator и использовать класс StreamSupport().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...