Стрим у Јави је низ елемената на којима се могу изводити секвенцијалне или паралелне операције.
Може постојати „н“ број међуоперација и, на крају, терминална операција, након које се враћа резултат.
Преглед садржаја
Шта је ток?
Стреамовима може управљати Стреам АПИ, који је уведен у Јави 8.
Замислите Стреам као производни цевовод у којем нека роба треба да се произведе, сортира, а затим спакује за испоруку. У Јави, та добра су објекти или колекције објеката, операције су производња, сортирање и паковање, а цевовод је ток.
Компоненте тока су:
- Почетни унос
- Међуоперације
- Рад терминала
- Крајњи резултат
Хајде да истражимо неке карактеристике тока у Јави:
- Стреам није структура података у меморији; радије, то је низ низова, објеката или колекција објеката којима се управља одређеним методама.
- Токови су декларативне природе, тј. ви специфицирате шта да радите, али не и како.
- Могу се конзумирати само једном јер се нигде не чувају.
- Стреам не мења оригиналну структуру података; из њега само изводи нову структуру.
- Враћа крајњи резултат изведен из коначног метода у цевоводу.
Стреам АПИ наспрам обраде колекција
Колекција је структура података у меморији која чува и обрађује податке. Колекције пружају структуре података као што су Сет, Мап, Лист, итд., за складиштење података. С друге стране, стреам је начин за ефикасан пренос података након обраде кроз цевовод.
Ево примера колекције АрраиЛист: –
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(0, 3); System.out.println(list); } } Output: [3]
Као што можете видети у горњем примеру, можете креирати колекцију АрраиЛист, складиштити податке у њој, а затим радити на тим подацима користећи различите методе.
Користећи стреам, можете радити на постојећој структури података и вратити нову измењену вредност. Испод је пример креирања колекције АрраиЛист и филтрирања помоћу тока.
import java.util.ArrayList; import java.util.stream.Stream; public class Main { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList(); for (int i = 0; i < 20; i++) { list.add(i+1); } System.out.println(list); Stream<Integer> filtered = list.stream().filter(num -> num > 10); filtered.forEach(num -> System.out.println(num + " ")); } } #Output [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 11 12 13 14 15 16 17 18 19 20
У горњем примеру, ток је креиран коришћењем постојеће листе, а листа се понавља да би филтрирала вредности веће од 10. Приметите да ток не складишти ништа, листа се само понавља, а резултат се штампа. Ако покушате да одштампате ток, добићете референцу на ток уместо вредности.
Рад на Јава Стреам АПИ-ју
Јава Стреам АПИ преузима изворну колекцију елемената или низ елемената и затим извршава операције на њима да би добио крајњи резултат. Поток је само цевовод кроз који низ елемената пролази и на неки начин се трансформише.
Стрим се може креирати из различитих извора, укључујући:
- Колекција као што је листа или скуп.
- Низ.
- Од датотека и њихових путања помоћу бафера.
Постоје две врсте операција које се изводе у току:-
- Интермедиате Оператионс
- Терминалне операције
Интермедиате вс. Терминал Оператионс
Свака посредна операција враћа нови ток интерно који трансформише улаз користећи наведени метод. Ништа се заправо не прелази; Уместо тога, преноси се на следећи ток. Тек у терминалној операцији се ток прелази да би се добио жељени резултат.
На пример, имате листу од 10 бројева које желите да филтрирате и затим мапирате на нешто. Неће се сваки елемент листе одмах прећи да би се добио филтрирани резултат и мапирао на нешто друго. Уместо тога, појединачни елементи ће бити проверени, и ако испуњавају услов, биће мапирани. Нови токови за сваки елемент.
Операција мапе ће се извршити на појединачним ставкама које задовољавају филтер, а не на читавој листи. И у време рада терминала, они се прелазе и комбинују у један резултат.
Након обављања операције терминала, ток се троши и више се не може даље користити. Морате креирати нови ток да бисте поново извршили исте операције.
Извор: Тхе Боред Дев
Са површинским разумевањем како токови функционишу, хајде да скочимо на детаље имплементације стримова у Јави.
#1. Празан ток
Направите празан ток користећи празну методу Стреам АПИ-ја.
import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream emptyStream = Stream.empty(); System.out.println(emptyStream.count()); } } Output: 0
Овде, ако одштампате број елемената у овом току, добијате 0 као излаз јер је то празан ток без елемената. Празни токови су од велике помоћи у избегавању изузетака нултог показивача.
#2. Стрим из колекција
Колекције као што су Листс и Сет излажу методу стреам() која вам омогућава да креирате ток из колекције. Креирани ток се затим може прећи да би се добио крајњи резултат.
ArrayList<Integer> list = new ArrayList(); for (int i = 0; i < 20; i++) { list.add(i+1); } System.out.println(list); Stream<Integer> filtered = list.stream().filter(num -> num > 10); filtered.forEach(num -> System.out.println(num + " ")); #Output [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 11 12 13 14 15 16 17 18 19 20
#3. Стреам из низова
Метод Арраис.стреам() се користи за креирање тока из низа.
import java.util.Arrays; public class Main { public static void main(String[] args) { String[] stringArray = new String[]{"this", "is", "techblog.co.rs"}; Arrays.stream(stringArray).forEach(item -> System.out.print(item + " ")); } } #Output this is techblog.co.rs
Такође можете одредити почетни и завршни индекс елемената за креирање низа. Почетни индекс је инклузиван, док је крајњи индекс искључив.
String[] stringArray = new String[]{"this", "is", "techblog.co.rs"}; Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " ")); Output: is techblog.co.rs
#4. Проналажење минималних и максималних бројева помоћу стреамова
Приступ максималном и минималном броју колекције или низа може се обавити коришћењем компаратора у Јави. Методе мин() и мак() прихватају компаратор и враћају Опциони објекат.
Опциони објекат је објекат контејнера који може или не мора да садржи вредност која није нулта. Ако садржи вредност која није нулта, позивање методе гет() на њој ће вратити вредност.
import java.util.Arrays; import java.util.Optional; public class MinMax { public static void main(String[] args) { Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11}; Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare); System.out.println(maxValue.get()); Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare); System.out.println(minValue.get()); } } #Output 82 3
Ресурси за учење
Сада када имате основно разумевање токова у Јави, ево 5 ресурса за вас да се добро упознате са Јавом 8:
#1. Јава 8 у акцији
Ова књига је водич који приказује нове функције Јаве 8, укључујући стримове, ламбда и програмирање у функционалном стилу. Квизови и питања за проверу знања такође су део књиге, која ће вам помоћи да повратите оно што сте научили.
Ову књигу можете добити у формату меког повеза као иу формату аудио књиге на Амазону.
#2. Јава 8 Ламбдас: Функционално програмирање за масе
Ова књига је посебно дизајнирана да научи основне Јава СЕ програмере како додавање Ламбда израза утиче на језик Јава. Укључује течна објашњења, вежбе кода и примере за савладавање Јава 8 ламбда израза.
Доступан је у формату меког повеза и Киндле издању на Амазону.
#3. Јава СЕ 8 за заиста нестрпљиве
Ако сте искусан Јава СЕ програмер, ова књига ће вас водити кроз побољшања направљена у Јава СЕ 8, АПИ за ток, додавање ламбда израза, побољшања истовременог програмирања у Јави и неке Јава 7 функције које већина људи нема не знам за.
Доступан је само у меком повезу на Амазону.
#4. Научите Јава функционално програмирање са Ламбдас & Стреамс
Овај Удеми курс истражује основе функционалног програмирања у Јави 8 и 9. Ламбда изрази, референце метода, токови и функционални интерфејси су концепти на које се овај курс фокусира.
Такође укључује гомилу Јава загонетки и вежби које се односе на функционално програмирање.
#5. Јава Цласс Либрари
Јава Цласс Либрари је део основне Јава специјализације коју нуди Цоурсера. Научиће вас како да пишете код безбедан типа користећи Јава Генерицс, разумете библиотеку класа која се састоји од преко 4000 класа, како да радите са датотекама и како да рукујете грешкама у току извршавања. Међутим, постоје неки предуслови за похађање овог курса:
- Увод у Јаву
- Увод у објектно оријентисано програмирање са Јавом
- Објектно оријентисане хијерархије у Јави
Завршне речи
Јава Стреам АПИ и увођење Ламбда функција у Јаву 8 су поједноставили и побољшали многе ствари у Јави, као што су паралелна итерација, функционални интерфејси, мање кода, итд.
Међутим, токови имају нека ограничења; њихово највеће ограничење је то што се могу конзумирати само једном. Ако сте Јава програмер, горе поменути ресурси могу вам помоћи да разумете ове теме много детаљније, па их обавезно погледајте.
Можда бисте желели да знате и о руковању изузетцима у Јави.