JavaRush /Курси /Java Syntax Zero /Потоки даних

Потоки даних

Java Syntax Zero
Рівень 19 , Лекція 3
Відкрита

1. Нововведення в Java 8: функціональне програмування

У версії Java 8 з'явилася потужна підтримка функціонального програмування. Правду кажучи, довгоочікувана підтримка функціонального програмування. Тепер код можна писати швидше, натомість читати — складніше 🙂

Перед вивченням функціонального програмування в Java рекомендуємо як слід розібратися в трьох речах:

  1. ООП, успадкування та інтерфейси.
  2. Дефолтна реалізація методів в інтерфейсі.
  3. Внутрішні й анонімні класи.

Добра новина — навіть не знаючи всього цього, можна користуватися багатьма можливостями функціонального програмування в Java. Погана новина — зрозуміти, як саме все влаштовано і як все працює, без тих самих внутрішніх анонімних класів досить складно.

У наступних лекціях ми зосередимося на тому, як легко й просто користуватися можливостями функціонального програмування в Java без глибокого розуміння його принципів.

Щоб опанувати всі особливості функціонального програмування в Java, знадобиться не один місяць. А от читати такий код можна навчитися за кілька годин. Тому пропонуємо почати з малого. Скажімо, з тих-таки потоків вводу-виведення.


2. Потоки вводу-виведення: ланцюжки потоків

Пам'ятаєте, колись ви вивчали потоки вводу-виведення: InputStream, OutputStream, Reader, Writer тощо?

Були класи-потоки (як-от FileInputSteam), які читали дані з джерел даних, а були й проміжні потоки даних (як-от InputStreamReader й BufferedReader), які читали дані з інших потоків.

Ці потоки можна було поєднувати в ланцюжки обробки даних. Наприклад, отак:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

Важливо зазначити, що в перших кількох рядках коду ми просто складаємо ланцюжок зі Stream-об'єктів, але реальні дані цим ланцюжком потоків ще не передаються.

І тільки коли ми викличемо метод buff.readLine(), відбудеться таке:

  1. Об'єкт BufferedReader викличе метод read() для об'єкта InputStreamReader
  2. Об'єкт InputStreamReader викличе метод read() для об'єкта FileInputStream
  3. Об'єкт FileInputStream почне читати дані з файлу

Тобто ніякого руху даних у ланцюжку потоків не буде, доки ми не почнемо викликати методи типу read() або readLine(). Саме лише конструювання ланцюжка потоків дані цим ланцюжком не передає. Потоки не зберігають дані, а тільки читають їх з інших потоків.

Колекції й потоки

Починаючи з Java 8 з'явилася можливість отримати потік для читання даних із колекцій (і не тільки з них). Але й це ще не найцікавіше. Насправді з'явилася можливість легко й просто конструювати складні ланцюжки потоків даних; водночас код, який раніше потребував 5–10 рядків, тепер можна було записати 1-2 рядками.

Приклад — пошук рядка максимальної довжини у списку рядків:

Пошук рядка максимальної довжини
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Привіт", "як", "справи?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Привіт", "як", "справи?");
Stream stream1 = list.stream();
Stream stream2 = stream1.max((s1, s2)-> s1.length()-s2.length());
String max = stream2.get();

3. Інтерфейс Stream

Розширену підтримку потоків у Java 8 реалізовано за допомогою інтерфейсу Stream<T>. де T — це тип-параметр. Він позначає тип даних, які передаються в потоці. Інакше кажучи, потік є повністю незалежним від типу даних, які він передає.

Для отримання об'єкта-потоку з колекції досить викликати для неї метод stream(). Цей код має приблизно такий вигляд:

Stream<Тип> ім'я = колекція.stream();
Отримання потоку з колекції

За цих обставин колекція вважатиметься джерелом даних потоку, а об'єкт типу Stream<Тип> — інструментом для отримання даних із колекції саме у вигляді потоку даних.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Привіт", "як", "справи?");
Stream<String> stream = list.stream();

До речі, потік можна отримати не тільки з колекції, а й із масиву. Для цього слід скористатися методом Arrays.stream(); Приклад:

Stream<Тип> ім'я = Arrays.stream(масив);
Отримання потоку з масиву

За цих обставин масив вважатиметься джерелом даних для потоку ім'я.

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Після створення об'єкта Stream<Тип> ніякого руху даних не відбувається. Ми просто отримали об'єкт-потік для того, щоб почати будувати ланцюжок із потоків-даних.


Коментарі (15)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Кирило Рівень 43
4 листопада 2024
нєнапряжненька лекція
Nicky^^ Рівень 32
10 серпня 2023
Please, send some likes for achievement))
𝙈𝙖𝙠𝙨𝙞𝙢 Рівень 108 Expert
19 травня 2023
Будь ласка накиньте лайки для ачівки :)
unite Рівень 24 Expert
19 лютого 2023
таке відчуття що вирвано з контексту, для чого використовувавти Стрім не зхрозуміло з лекції.
Павло Лєбєдєв Рівень 111 Expert
10 серпня 2023
Це треба знати - тренуйтеся. На вас будуть по-іншому дивитись, якщо ви це будете розуміти і знати.
Olexandr Рівень 47
10 лютого 2024
89 рівень!!! Скільки ж всього рівнів на JavaRush?)))
Павло Лєбєдєв Рівень 111 Expert
22 лютого 2024
У джава-унівеситеті, здається, 109. Але не бійтеся. Не мною сказано: "Лупайте цю скалу, нехай ні жар, ні холод не спинять вас..." Не ви перші, і не останні. Головне - не здаватись і не зупинятись :)
Павло Лєбєдєв Рівень 111 Expert
22 лютого 2024
Стріми - це цікаво і дуже корисно. Доведеться дізнаватись докладніше з інтернету.
Андрии Бумер Рівень 29
30 жовтня 2024
поки я сюди дістався вже 111 зі 109)))
Maksym Рівень 35
1 лютого 2023
Колеги, накидайте лайків під цей коментар, для ачівки, дякую!)
Павло Лєбєдєв Рівень 111 Expert
22 лютого 2024
Навіщо це тобі?
WhoAMI Рівень 51
24 грудня 2022
рекомендують розібратись із матеріалом який іде після Java Syntax, а потім повернутись до цієї лекції? цікавий підхід
Павло Лєбєдєв Рівень 111 Expert
22 лютого 2024
Це не єдине таке на джавараш. Як на мене, деякі теми потім будут не розкриті (наприклад, паттерни) - просто довідкова інфа для тих, хто знає (і хоче освіжити в пам'яті), а не для тих, хто тільки це вивчає...
Віталій Рівень 33
15 лютого 2022
java core є закритим на рівні java syntax
Neridnyi Taras Рівень 23
14 грудня 2022
треба тоді це залишити й тоді повернутися(коли дойдеш до java core)