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.