«1. Обзор
В этом руководстве мы рассмотрим различные способы преобразования Iterable в Collection в Java.
Мы начнем с простых решений Java, а затем рассмотрим варианты, которые также предоставляют библиотеки Guava и Apache Commons.
2. Iterable и Iterator
Сначала мы определим наш Iterable:
Iterable<String> iterable = Arrays.asList("john", "tom", "jane");
Мы также определим простой Iterator, чтобы подчеркнуть разницу между преобразованием Iterable в Collection и Iterator в Collection :
Iterator<String> iterator = iterable.iterator();
3. Использование простой Java
3.1. Iterable to Collection
Мы можем использовать метод Java 8 forEach() для добавления всех элементов в список:
@Test
public void whenConvertIterableToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<String>();
iterable.forEach(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
Или использовать класс Spliterator для преобразования нашего Iterable в Stream, а затем в Collection:
List<String> result =
StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toList());
~~ ~ 3.2. Iterator to Collection
С другой стороны, вместо использования forEach() мы будем использовать forEachRemaining() с Iterator:
@Test
public void whenConvertIteratorToListUsingJava8_thenSuccess() {
List<String> result = new ArrayList<String>();
iterator.forEachRemaining(result::add);
assertThat(result, contains("john", "tom", "jane"));
}
Мы также можем создать Spliterator из нашего Iterator, а затем использовать его для преобразования Iterator в Поток:
List<String> result =
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(Collectors.toList());
3.3. Использование цикла For
Давайте также рассмотрим решение, использующее очень простой цикл for для преобразования нашего объекта Iterable в список:
@Test
public void whenConvertIterableToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<String>();
for (String str : iterable) {
result.add(str);
}
assertThat(result, contains("john", "tom", "jane"));
}
С другой стороны, мы будем использовать hasNext() и next() с итератором:
@Test
public void whenConvertIteratorToListUsingJava_thenSuccess() {
List<String> result = new ArrayList<String>();
while (iterator.hasNext()) {
result.add(iterator.next());
}
assertThat(result, contains("john", "tom", "jane"));
}
4. Использование Guava
Есть также несколько доступных библиотек, которые предоставляют удобные методы, помогающие нам достичь этого.
Давайте посмотрим, как мы можем использовать Guava для преобразования из Iterable в List:
Мы можем создать новый List из Iterable или Iterator, используя Lists.newArrayList():
List<String> result = Lists.newArrayList(iterable);
Или мы можем использовать ImmutableList .copyOf():
List<String> result = ImmutableList.copyOf(iterable);
5. Использование Apache Commons
Наконец, мы будем использовать Apache Commons IterableUtils для создания списка из Iterable:
List<String> result = IterableUtils.toList(iterable);
Точно так же мы будем использовать IteratorUtils для создания Список из нашего итератора:
List<String> result = IteratorUtils.toList(iterator);
6. Заключение
В этой короткой статье мы узнали, как преобразовать Iterable и Iterator в коллекцию с помощью Java. Мы исследовали различные способы использования простой Java и двух внешних библиотек: Guava и Apache Commons.
Как всегда, полный исходный код доступен на GitHub.