1.1.5. Генерация чисел Фибоначчи с помощью потока
До.сих.пор.мы.писали.методы,.которые.выводят.одно.значение.из.последователь-
ности.Фибоначчи..А.что,.если.вместо.этого.мы.хотим.вывести.всю.последователь-
ность.вплоть.до.некоторого.значения?.Легко.преобразовать.
fib4()
.в.поток.Java,.
задействуя.шаблон.генератора.кода..В.процессе.итерирования.генератора.на.
каждой.итерации.будет.выводиться.значение.последовательности.Фибоначчи.с.ис-
пользованием.лямбда-функции,.возвращающей.следующее.число.(листинг.1.8).
Листинг 1.8.
Fib5.java
package
chapter1;
import
java.util.stream.IntStream;
public class
Fib5 {
private int
last = 0, next = 1; // fib(0), fib(1)
public
IntStream stream() {
return
IntStream.
generate
(() -> {
int
oldLast = last;
last = next;
next = oldLast + next;
return
oldLast;
});
}
public static void
main(String[] args) {
Fib5 fib5 =
new
Fib5();
fib5.stream().limit(41).forEachOrdered(System.
out
::println);
}
}
32
Глава 1.
Простые задачи
Если.запустить.
Fib5.java
,.то.будут.напечатаны.первые.41.число.из.последова-
тельности.Фибоначчи..Для.каждого.числа.в.последовательности.функция.
Fib5
.
запускает.один.раз.лямбда-функцию.
generate()
,.которая.управляет.переменными.
последнего.и.следующего.экземпляров..Вызов.функции.
limit()
.гарантирует,.что.
потенциально.бесконечный.поток.после.достижения.41-го.элемента.перестанет.
извлекать.числа.
1.2. ПРОСТЕЙШЕЕ СЖАТИЕ
Зачастую.важна.бывает.экономия.места.—.виртуального.или.реального..Использо-
вать.меньше.места.означает.более.эффективно.работать.и.экономить.деньги..Если.
вы.арендуете.квартиру.большей.площади,.чем.нужно.для.вашей.семьи.и.вещей,.
то.можете.ужаться.до.жилья.меньшего.размера,.которое.стоит.дешевле..Если.вы.
побайтно.платите.за.хранение.данных.на.сервере,.то.можете.сжать.данные.так,.
чтобы.их.хранение.обходилось.дешевле..
Сжатие
.—.это.процесс.получения.дан-
ных.и.их.кодирования.(изменения.формы).таким.образом,.чтобы.они.занимали.
меньше.места..
Распаковка
.предусматривает.обратный.процесс.—.возвращение.
данных.в.исходную.форму.
Если.сжатие.данных.так.эффективно.для.их.хранения,.то.почему.оно.не.применя-
ется.для.всех.данных?.Дело.в.том,.что.существует.компромисс.между.временем.
и.пространством..На.то,.чтобы.сжать.часть.данных.и.распаковать.их.обратно.
в.исходную.форму,.требуется.время..Поэтому.сжатие.данных.имеет.смысл.только.
в.ситуациях,.когда.небольшой.размер.важнее,.чем.быстрое.выполнение..Возьмем,.
к.примеру,.большие.файлы,.передаваемые.через.интернет..Их.сжатие.имеет.смысл,.
поскольку.для.передачи.файлов.потребуется.больше.времени,.чем.для.их.рас-
паковки.после.получения..Кроме.того,.время,.необходимое.для.сжатия.файлов.
при.их.хранении.на.исходном.сервере,.необходимо.учитывать.только.один.раз.
Сжать.данные.самыми.простыми.способами.можно.тогда,.когда.вы.понимаете,.
что.типы.хранилищ.данных.используют.больше.битов,.чем.необходимо.для.их.
содержимого..Например,.на.низком.уровне,.если.целые.числа.со.знаком,.значения.
которых.никогда.не.превысят.32.767,.сохраняются.в.памяти.как.64-разрядные.
целые.числа.—.
long
,.то.они.сохраняются.неэффективно..Вместо.этого.их.можно.
хранить.как.16-разрядные.целые.числа.—.
short
..Это.уменьшит.потребление.про-
странства.для.фактического.хранения.чисел.на.75.%.(16.бит.вместо.64)..Таким.
неэффективным.способом.хранятся.миллионы.чисел,.—.это.может.означать.до.
1.Мбайт.впустую.потраченного.пространства.
В.Java.из.соображений.простоты.(что,.конечно.же,.законная.цель).разработчик.
иногда.избавлен.от.размышлений..В.основном.в.коде.для.хранения.целых.чисел.
применяется.32-битный.тип.
int
..Это.нормально..Но.если.хранить.миллионы.
1.2. Простейшее сжатие
Do'stlaringiz bilan baham: |