Преобразуване на Iterable в колекция в Java

1. Общ преглед

В този урок ще изследваме различни начини за конвертиране на Iterable в колекция в Java .

Ще започнем с обикновени Java решения, след което ще разгледаме опциите, които библиотеките Guava и Apache Commons също предоставят.

2. Итерируем и итератор

Първо ще дефинираме нашия Iterable :

Iterable iterable = Arrays.asList("john", "tom", "jane");

Ще дефинираме и прост Iterator - за да подчертаем разликата между преобразуването на Iterable в Collection и Iterator в Collection :

Iterator iterator = iterable.iterator();

3. Използване на обикновена Java

3.1. Итерируемо за колекция

Можем да използваме метода Java 8 forEach () , за да добавим всички елементи към списъка :

@Test public void whenConvertIterableToListUsingJava8_thenSuccess() { List result = new ArrayList(); iterable.forEach(result::add); assertThat(result, contains("john", "tom", "jane")); }

Или използвайте класа Spliterator, за да конвертирате нашия Iterable в Stream, след това в Collection :

List result = StreamSupport.stream(iterable.spliterator(), false) .collect(Collectors.toList());

3.2. Итератор на колекция

От друга страна, вместо да използваме forEach () , ще използваме forEachRemaining () с Iterator :

@Test public void whenConvertIteratorToListUsingJava8_thenSuccess() { List result = new ArrayList(); iterator.forEachRemaining(result::add); assertThat(result, contains("john", "tom", "jane")); }

Можем също да създадем Spliterator от нашия Iterator, след което да го използваме за конвертиране на Iterator в Stream :

List result = StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) .collect(Collectors.toList());

3.3. Използване на For-Loop

Нека да разгледаме и решение, което използва много прост цикъл за преобразуване на нашия Iterable в списък :

@Test public void whenConvertIterableToListUsingJava_thenSuccess() { List result = new ArrayList(); for (String str : iterable) { result.add(str); } assertThat(result, contains("john", "tom", "jane")); }

От друга страна, ще използваме hasNext () и next () с итератора :

@Test public void whenConvertIteratorToListUsingJava_thenSuccess() { List result = new ArrayList(); while (iterator.hasNext()) { result.add(iterator.next()); } assertThat(result, contains("john", "tom", "jane")); }

4. Използване на Гуава

Налични са и няколко библиотеки, които предоставят удобни методи, които да ни помогнат да постигнем това.

Нека да видим как можем да използваме Guava, за да конвертираме от итерируем в списък :

Можем да създадем нов Списък от Iterable или Iterator, като използваме Lists.newArrayList () :

List result = Lists.newArrayList(iterable);

Или можем да използваме ImmutableList.copyOf () :

List result = ImmutableList.copyOf(iterable);

5. Използване на Apache Commons

И накрая, ще използваме Apache Commons IterableUtils, за да създадем списък от Iterable :

List result = IterableUtils.toList(iterable);

По същия начин ще използваме IteratorUtils, за да създадем списък от нашия Iterator :

List result = IteratorUtils.toList(iterator);

6. Заключение

В тази кратка статия научихме как да конвертираме Iterable и Iterator в колекция с помощта на Java. Проучихме различни начини, използвайки обикновена Java и две външни библиотеки: Guava и Apache Commons.

Както винаги, пълният изходен код е достъпен в GitHub.