1. Обзор
В этом кратком руководстве мы узнаем о различных способах получения размера Iterable
в Java.
2. Итерируемый и итератор
Iterable
— один из основных интерфейсов классов коллекций в Java.
Интерфейс Collection
расширяет Iterable
, поэтому все дочерние классы Collection
также реализуют Iterable
.
Iterable
имеет только один метод, который создает Iterator
:
public interface Iterable<T> {
public Iterator<T> iterator();
}
Затем этот итератор
можно использовать для перебора элементов в Iterable
.
3. Итерируемый размер с использованием Core Java
3.1. для каждого
цикла
Все классы, реализующие Iterable
, подходят для цикла for-each
в Java.
Это позволяет нам перебирать элементы в Iterable
, увеличивая счетчик, чтобы получить его размер:
int counter = 0;
for (Object i : data) {
counter++;
}
return counter;
3.2. Коллекция.размер()
В большинстве случаев Iterable
будет экземпляром Collection,
например List
или Set
.
В таких случаях мы можем проверить тип Iterable
и вызвать для него метод size()
, чтобы получить количество элементов.
if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
Вызов size()
обычно намного быстрее, чем перебор всей коллекции.
Вот пример, показывающий комбинацию двух вышеуказанных решений:
public static int size(Iterable data) {
if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
int counter = 0;
for (Object i : data) {
counter++;
}
return counter;
}
3.3. Поток.счет()
Если мы используем Java 8, мы можем создать поток
из Iterable.
Затем объект потока можно использовать для получения количества элементов в Iterable
.
return StreamSupport.stream(data.spliterator(), false).count();
4. Итерируемый размер с использованием сторонних библиотек
4.1. IterableUtils#размер()
В библиотеке Apache Commons Collections
есть хороший класс IterableUtils
, предоставляющий статические служебные методы для экземпляров Iterable .
Прежде чем мы начнем, нам нужно импортировать последние зависимости из Maven Central :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
Мы можем вызвать метод size () объекта
IterableUtils
для объекта Iterable
, чтобы получить его размер.
return IterableUtils.size(data);
4.2. Итерации#размер()
Точно так же библиотека Google Guava
также предоставляет набор статических служебных методов в своем классе Iterables
для работы с экземплярами Iterable .
Прежде чем мы начнем, нам нужно импортировать последние зависимости из Maven Central :
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Вызов статического метода size() в классе
Iterables
дает нам количество элементов.
return Iterables.size(data);
Под капотом и IterableUtils
, и Iterables
используют комбинацию подходов, описанных в 3.1 и 3.2, для определения размера.
5. Вывод
В этой статье мы рассмотрели различные способы получения размера Iterable
в Java.
Исходный код этой статьи и соответствующие тестовые примеры доступны на GitHub .