1. Обзор
В этом руководстве мы рассмотрим различные способы преобразования Iterable
в Collection
в Java .
Мы начнем с простых решений Java, а затем рассмотрим варианты, которые также предоставляют библиотеки Guava и Apache Commons.
2. Итерируемый
и итератор
Во- первых, мы определим наш Iterable
:
Iterable<String> iterable = Arrays.asList("john", "tom", "jane");
Мы также определим простой итератор
, чтобы подчеркнуть разницу между преобразованием Iterable
в Collection
и Iterator
в Collection
:
Iterator<String> iterator = iterable.iterator();
3. Использование простой Java
3.1. Итерируемый
для коллекции
Мы можем использовать метод 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. Итератор
в коллекцию
С другой стороны, вместо использования 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
в Stream
:
List<String> result =
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.collect(Collectors.toList());
3.3. Использование цикла For
Давайте также посмотрим на решение, которое использует очень простой цикл for для преобразования нашего Iterable
в List
:
@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()
с Iterator
:
@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 для преобразования Iterable
в 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
из нашего Iterator
:
List<String> result = IteratorUtils.toList(iterator);
6. Заключение
В этой короткой статье мы узнали, как преобразовать Iterable
и Iterator
в коллекцию
с помощью Java. Мы исследовали различные способы использования простой Java и двух внешних библиотек: Guava и Apache Commons.
Как всегда, полный исходный код доступен на GitHub .