русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Синтаксис foreach и итераторы


Дата добавления: 2015-06-12; просмотров: 890; Нарушение авторских прав


До настоящего момента «синтаксис foreach» использовался в основном с массивами, но он также будет работать с любым объектом Collection. Некоторые примеры уже встречались нам при работе с ArrayList, но можно привести и более об­щее подтверждение:

//: holding/ForEachCollections.java

// Синтаксис foreach работает с любыми коллекциями

import java.util.*;

 

public class ForEachCollections {

public static void main(String[] args) {

Collection<String> cs = new LinkedList<String>();

Collections.addAll(cs,

"Take the long way home".split(" "));

for(String s : cs)

System.out.print("'" + s + "' ");

}

}

<spoiler text="Output:">

'Take' 'the' 'long' 'way' 'home'

</spoiler> Поскольку cs является Collection, этот пример показывает, что поддержка foreach является характеристикой всех объектов Collection. Работа этой конструкции объясняется тем, что в Java SE5 появился новый интерфейс Iterable, который содержит метод iterator()для создания Iterator, и именно интерфейс Iterable используется при переборе последовательности в синтаксисе foreach. Следовательно, создав любой класс, реализующий Iterable, вы сможете использовать его в синтаксисе foreach:

//: holding/IterableClass.java

// Любой Iterable работает с foreach.

import java.util.*;

 

public class IterableClass implements Iterable<String> {

protected String[] words = ("And that is how " +

"we know the Earth to be banana-shaped.").split(" ");

public Iterator<String> iterator() {

return new Iterator<String>() {

private int index = 0;

public boolean hasNext() {

return index < words.length;

}

public String next() { return words[index++]; }

public void remove() { // Не реализован



throw new UnsupportedOperationException();

}

};

}

public static void main(String[] args) {

for(String s : new IterableClass())

System.out.print(s + " ");

}

}

<spoiler text="Output:">

And that is how we know the Earth to be banana-shaped.

</spoiler> Метод iterator() возвращает экземпляр анонимной внутренней реализации Iterator<String>, последовательно доставляющей каждое слово в массиве. В main() мы видим, что IterableClass действительно работает в синтаксисе foreach. В Java SE5 многие классы реализуют Iterable, прежде всего все классы Collection (но не Map). Например, следующий код выводит все переменные окружения (environment) операционной системы:

//: holding/EnvironmentVariables.java

import java.util.*;

 

public class EnvironmentVariables {

public static void main(String[] args) {

for(Map.Entry entry: System.getenv().entrySet()) {

System.out.println(entry.getKey() + ": " +

entry.getValue());

}

}

} /* (Execute to see output) */

System.getenv() возвращает Map, entrySet() создает Set с элементами Map.Entry, a Set поддерживает Iterable и поэтому может использоваться в цикле foreach. Синтаксис foreach работает с массивами и всем, что поддерживает Iterable, но это не означает, что массив автоматически поддерживает Iterable:

//: holding/ArrayIsNotIterable.java

import java.util.*;

 

public class ArrayIsNotIterable {

static <T> void test(Iterable<T> ib) {

for(T t : ib)

System.out.print(t + " ");

}

public static void main(String[] args) {

test(Arrays.asList(1, 2, 3));

String[] strings = { "A", "B", "C" };

// Массив работает в foreach. но не является Iterable:

//! test(strings);

// его необходимо явно преобразовать к Iterable:

test(Arrays.asList(strings));

}

}

<spoiler text="Output:">

1 2 3 A B C

</spoiler> Попытка передачи массива в аргументе Iterable завершается неудачей. Автоматическое преобразование в Iterable не производится; его необходимо выполнять вручную.



<== предыдущая лекция | следующая лекция ==>
Collection и Iterator | Идиома «метод-адаптер»


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.139 сек.