You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: Part 2 - Sequence Basics/1. Creating a sequence.md
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@
4
4
5
5
# Создание последовательности
6
6
7
-
В прошлых примерах мы использовали `Subject`'ы и вручную подавали на них значения чтобы создать последовательность. Мы делали так чтобы продемонстрировать некоторые ключевые моменты, а главное, самый основной в Rx метод,`subscribe`. В большинстве случаев `Subject` это не лучший способ создать новый `Observable`. В этом разделе мы рассмотрим более элегантные способы сделать это.
7
+
В прошлых примерах мы использовали `Subject`'ы и вручную подавали на них значения чтобы создать последовательность. Мы делали так чтобы продемонстрировать некоторые ключевые моменты, в том числе основной Rx метод `subscribe`. В большинстве случаев `Subject` это не лучший способ создать новый `Observable`. В этом разделе мы рассмотрим более элегантные способы сделать это.
Код [выше](/tests/java/itrx/chapter2/creating/ObservableFactoriesExample.java) ничего не напечатает. Однако заметьте, что это не означает что программа блокируется. По-факту она просто мгновенно завершается.
62
+
Код [выше](/tests/java/itrx/chapter2/creating/ObservableFactoriesExample.java) ничего не напечатает. Но это не означает что программа блокируется. По-факту она просто мгновенно завершается.
`defer` не создает новый `Observable`, но позволяет определить каким образом `Observable` будет создан при появлении подписчиков. Подумайте как бы вы создали `Observable` который будет выдавать текущее время. Так как значение только одно, кажется, что здесь нам поможет`just`.
83
+
`defer` не создает новый `Observable`, но позволяет определить каким образом `Observable` будет создан при появлении подписчиков. Подумайте, как бы вы создали `Observable` который будет выдавать текущее время? Так как значение только одно, похоже, что здесь нам может помочь`just`.
84
84
85
85
```java
86
86
Observable<Long> now =Observable.just(System.currentTimeMillis());
Обратите внимание как второй подписчик, подписавшись на секунду позже, получает такое же время. Это происходит потому что значение времени было вычислено лишь единажды: когда выполнение доходит до метода `just`. Однако в нашем случае мы хотим вычислять текущее время при каждой подписке. `defer` принимает функцию, которая возвращает `Observable` и будет выполнена для каждого нового подписчика.
98
+
Обратите внимание как второй подписчик, подписавшись на секунду позже, получил такое же время. Это происходит потому что значение времени было вычислено лишь единажды: когда выполнение доходит до метода `just`. Однако в нашем случае мы хотим вычислять текущее время при каждой подписке. `defer` принимает функцию, которая возвращает `Observable` и будет выполнена для каждого нового подписчика.
Все намного проще чем выглядит. Внутри всего лишь функция, которая принимает `Subscriber` для типа `T`. Внутри него мы можем вручную определить события, которые будут выдаваться подписчику.
122
+
Все намного проще чем выглядит. Внутри всего лишь функция, которая принимает `Subscriber` для типа `T`. Внутри нее мы можем вручную определить события, которые будут выдаваться подписчику.
Данный метод является рекомендуемым способом создания `Observable` в случае если ни один из других способов не подходит. Это похоже на то, как мы создавали `Subject` и вручную подавали на него значения, однако есть несколько важных отличий. В первую очередь, источних событий аккуратно инкапсулирован и отделен от другого кода. Во-вторых, `Subject`'ы имеют неочевидные опасности: любой кто имеет доступ к обьекту сможет изменить последовательность. Мы еще вернемся к этой проблеме позже.
144
144
145
-
Еще одним ключевым отличием от использования `Subject` является то, что код выполняется "lazily", только тогда когда прибывает новый подписчик. В примере выше, код выполняется _не_ в момент создания `Observable` (так как подписчиков еще нет), а в момент вызова метода `subscribe`. Это означает, что значения будет вычислены заново для каждого подписчика, как в `ReplaySubject`. Конечный результат похож на `ReplaySubject`, за исключением кеширования. С помощью `create` мы можем легко перенести выполнение в отделный поток, в то время как с `ReplaySubject` нам приходилось бы вручную создавать отдельные потоки для вычисления значений. Мы еще рассмотрим способы сделать выполнение метода `onSubscribe` параллельным.
145
+
Еще одним ключевым отличием от использования `Subject` является то, что код выполняется "lazily", только тогда когда прибывает новый подписчик. В примере выше, код выполняется _не_ в момент создания `Observable` (так как подписчиков еще нет), а в момент вызова метода `subscribe`. Это означает, что значения будет вычислены заново для каждого подписчика, как в `ReplaySubject`. Конечный результат похож на `ReplaySubject`, за исключением кеширования. С помощью `create` мы также можем легко перенести выполнение в отделный поток, в то время как с `ReplaySubject` нам приходилось бы вручную создавать потоки для вычисления значений. Мы еще рассмотрим способы сделать выполнение метода `onSubscribe` параллельным.
146
146
147
147
148
148
Вы уже могли заметить что любой из предыдущих `Observable` можно реализовать при помощи `Observable.create`. Наш пример для `create` эквивалентен `Observable.just("hello")`.
Вы можете превратить любые входные данные в `Observable` при помощи `create`. Однако, для распространенных типов данных, существуют уже готовые решения.
246
+
Вы можете превратить любые входные данные в `Observable` при помощи `create`. Однако, для распространенных типов данных, существуют уже готовые методы, призваные облегчить этот процесс.
247
247
248
-
`Future`'ы являются частью Java и вы должно быть сталкивались с ними во время работы с фреймворками, использующими многопоточность. Они являются менее мощным многопоточным инструментом чем Rx, так как возвращают только одно значение. Как правило, вы захотите превратить их в `Observable`.
248
+
`Future`'ы являются частью Java и вы должно быть сталкивались с ними во время работы с фреймворками использующими многопоточность. Они являются менее мощным многопоточным инструментом чем Rx, так как возвращают только одно значение. Как правило, вы захотите превратить их в `Observable`.
249
249
250
250
```java
251
251
FutureTask<Integer> f =newFutureTask<Integer>(() -> {
@@ -268,7 +268,7 @@ Received: 21
268
268
Completed
269
269
```
270
270
271
-
`Observable` выдает результат `FutureTask` по-готовности, после чего завершается. Если задача была отменена, observable выдаст ошибку.`java.util.concurrent.CancellationException`.
271
+
`Observable` выдает результат `FutureTask` по-готовности, после чего завершается. Если задача была отменена, observable выдаст ошибку `java.util.concurrent.CancellationException`.
272
272
273
273
Если вы заинтересованы в результате `Future` только ограниченное время, существует возможность задать таймаут в качестве аргумента.
274
274
@@ -296,7 +296,7 @@ Received: 3
296
296
Completed
297
297
```
298
298
299
-
`Observable` это не то же что `Iterable` или `Stream`. `Observable` push-ориентированный, в том смысле, что вызов `onNext` провоцирует стек обработчиков выполниться вплоть до последнего `subscribe` метода (если не задано иначе). Остальные модели pull-ориентированные - значения в них запрашиваются с другой стороны и выполнение блокируется до возвращения результата.
299
+
`Observable` это не то же что `Iterable` или `Stream`. `Observable` push-ориентированный, в том смысле, что вызов `onNext` провоцирует стек обработчиков выполниться вплоть до последнего `subscribe` метода. Остальные модели pull-ориентированные - значения в них запрашиваются с другой стороны и выполнение блокируется до возвращения результата.
300
300
301
301
[Reducing a sequence](/Part 2 - Sequence Basics/2. Reducing a sequence.md) |
0 commit comments