Skip to content

Commit a75bc96

Browse files
authored
Chapter 5: collections
1 parent caf1fcb commit a75bc96

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

tutorial/05_Collections_Lists.adoc

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* про интерфейс Б можно сказать, что он *расширяет* интерфейс А (и опять-таки это синоним слова "наследник")
2626
* интерфейс Б никогда не может являться наследником класса А (запрещено правилами Java).
2727

28-
== Иерерхия коллекций
28+
== Иерархия коллекций
2929

3030
Коллекции Java образуют иерархию наследования. С ней можно ознакомиться, например, здесь: https://en.wikipedia.org/wiki/Java_collections_framework. Подобное изображение иерархий распространено среди программистов; в них наследник всегда рисуется ниже своего базового класса (интерфейса) и соединяется с ним стрелкой, ведущей в сторону базового класса (интерфейса).
3131

@@ -89,6 +89,11 @@ public interface Iterator<E> {
8989

9090
[source,java]
9191
----
92+
public class SomeClass {
93+
private static boolean condition(String s) {
94+
return ...// Some condition
95+
}
96+
9297
public static void foo(Collection<String> container) {
9398
Iterator<String> it = container.iterator();
9499
while (it.hasNext()) {
@@ -102,8 +107,32 @@ public interface Iterator<E> {
102107
}
103108
}
104109
// However, it's possible...
105-
container.removeIf(::condition);
110+
container.removeIf(SomeClass::condition);
106111
}
112+
}
107113
----
108114

115+
Что такое `ConcurrentModificationException`? Это исключение, связанное с так называемым контрактом итератора. Согласно этому контракту, во время работы итератора (от момента, когда он был создан, и до момента, когда на нём был вызван последний метод), запрещается менять коллекцию любым способом, за исключением вызова `remove` на итераторе.
116+
117+
Про метод `removeIf` см. раздел "Потоки и функции высшего порядка".
118+
119+
=== Интерфейс Collection и его реализация
120+
121+
По смыслу интерфейс `Collection` описывает объект, содержащий некоторое количество однотипных объектов. По контракту коллекции, туда можно добавлять элементы и удалять их, а также перебирать их с помощью итератора. Коллекция "как есть" (т.е. без расширений) не нумерует свои элементы, и не запрещает добавлять в коллекцию равные элементы.
122+
123+
Содержимое интерфейса описано здесь: https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html. Повторять это описание вряд ли имеет смысл; здесь мы лишь подчеркнём, что отдельного внимания заслуживают методы `stream()`, `parallelStream()`, `spliterator()` и `removeIf(predicate)`. Все они относятся к поддержке в Java функций высшего порядка, появившейся в версии 1.8 языка. Про неё см. раздел "Потоки и функции высшего порядка".
124+
125+
Коллекция "как есть" не имеет полных реализаций. Существует, однако, абстрактный класс `AbstractCollection`, обеспечивающий так называемый "скелет" реализации. Расширив этот абстрактный класс с помощью `extends`, мы можем создать собственную реализацию коллекции, добавив туда нужные для хранения данных поля и всего три метода:
126+
127+
* `iterator()` и `size()`, если мы хотим создать неизменяемую коллекцию. Итератор при этом должен поддерживать `next()` и `hasNext()`.
128+
* `add()`, если мы хотим создать изменяемую коллекцию. Следует добавить также реализацию `remove()` в итераторе.
129+
130+
Некоторые методы -- в первую очередь `clear()` -- абстрактный класс `AbstractCollection` реализует заведомо неэффективно.
131+
132+
=== Списки ===
133+
134+
TODO
135+
136+
=== Потоки и функции высшего порядка ===
109137

138+
TODO

0 commit comments

Comments
 (0)