Java Arrays & Generics: Java-эквивалент C # IEnumerable

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

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

12.12.2008 10:10:57
5 ОТВЕТОВ
РЕШЕНИЕ

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.

48
14.12.2008 16:25:49
Для получения дополнительной информации о том, почему вы не можете привести между Iterable <String> и Iterable <Object>, посмотрите ковариацию и контравариантность .
Mark McDonald 20.08.2011 09:32:20
Хорошо, теперь давайте обратимся к 500-фунтовой горилле в комнате. Как вы используете Iterable<T>? такое эквивалентное yield returnутверждение в Java?
BrainSlugs83 5.10.2014 03:11:53
@ BrainSlugs83 Я думаю, это другой вопрос.
Tom Hawtin - tackline 5.10.2014 08:19:16

Iterable <T>

4
12.12.2008 10:28:07

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

Iterable<T> <=> IEnumerable<T>
Iterator<T> <=> IEnumerator<T>
8
12.12.2008 10:23:46

Я считаю, что эквивалент 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);
2
12.12.2008 10:30:33

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

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

0
4.02.2016 10:55:46