Преобразование Iterable в массив

мне нужно вернуть String массив. Я использую гуаву, чтобы разделить String. Пожалуйста, смотрите код ниже

Iterable<String> arrayOfValues =  Splitter.on(";").split(myString);

возвращает Iterable. но мне нужен String[]. Есть ли способ дать Iterator< Element > и преобразовать их в Array[]. Большое Спасибо

8 ответов


использовать Iterables.toArray(Iterable<? extends T> iterable, Class<T> type) метод гуавы.


Если вы используете простую строку Java.метод split (regex), вы в порядке. Он возвращает строку[].

"my;string".split(";")

String[] splits = mystring.split(";");

Не используйте причудливые библиотеки, если они вам не нужны.


вы также можете использовать гуава это FluentIterable :

FluentIterable.from(Splitter.on(":").split(mystring)).toArray(String.class)

без Guava вы можете преобразовать Iterable<String> массиву с чем-то вроде этого

public static <String> String[] toArray(Iterable<String> itr) {
    ArrayList<String> ret = new ArrayList<>();
    for(String t : itr) {
        ret.add(t);
    }
    return ret.toArray(new String[]);
}

немного сложно написать общую версию этой функции из-за множество проблем с общими массивами в Java, поэтому аккуратнее.


в java 8 я предпочитаю использовать поток для преобразования iterable в массив:

StreamSupport.stream(yourIterable.spliterator(), false).toArray(String[]::new)

в guava вы можете преобразовать его следующим образом

 String test= "Welcome to java world";
 Iterable<String> tokens=Splitter.on(" ").split(test);
 String array[]=Iterables.toArray(tokens,String.class);

Если вы просто хотите получить доступ к элементам итератора, таким как массив, нет необходимости преобразовывать. Вы можете напрямую получить доступ к этим элементам по индексу

Эл.г

 System.out.println(Iterables.get(tokens,2));

хотя в вопросе говорится "преобразовать итератор в массив", ответы объясняют только, как преобразовать Iterable в Array.

Итак, для преобразования итератора в массив с Guava вы можете использовать Iterators.toArray(Iterator<? extends T> iterator, Class<T> type).


Я действительно согласен с ответом @rec:не используйте причудливые библиотеки, если они вам не нужны.

но я настоятельно рекомендую прочитать разделитель гуавы документация:

потому что Java builtin splitter может иметь некоторые сложные поведения..

например, предположим, что у вас есть конечные запятые или последовательные запятые во входных данных. Что будет возвращено после раскол?

  • null
  • ""
  • (отбрасывается)

;)