Муқаддима ба Java Threads дар Java 8
Java Streams, ки ҳамчун як қисми Java 8 муаррифӣ шудааст, барои кор бо ҷамъоварии маълумот истифода мешавад. Онҳо худи сохтори додаҳо нестанд, аммо метавонанд барои ворид кардани иттилоот аз дигар сохторҳои додаҳо тавассути фармоиш ва интиқол барои ба даст овардани натиҷаи ниҳоӣ истифода шаванд. Эзоҳ: Муҳим нест, ки Stream ва Threadро омехта накунед, зеро дар забони русӣ ҳарду истилоҳ аксар вақт дар як тарҷумаи “ҷараён” номида мешаванд. Ҷараён an objectро барои иҷрои амалиётҳо (аксар вақт интиқол ё нигоҳ доштани маълумот) ифода мекунад, дар ҳоле ки Thread (тарҷумаи аслӣ - ришта) an objectеро ифода мекунад, ки имкон медиҳад codeи муайяни барнома дар баробари шохаҳои дигари code иҷро карда шавад. Азбаски Stream сохтори алоҳидаи додаҳо нест, он ҳеҷ гоҳ манбаи маълумотро тағир намедиҳад. Ҷараёни Java дорои хусусиятҳои зерин мебошанд:-
Java Stream метавонад бо истифода аз бастаи "java.util.stream" истифода шавад. Онро бо истифода аз code ба скрипт ворид кардан мумкин аст:
import java.util.stream.* ;
Бо истифода аз ин code, мо инчунин метавонем ба осонӣ якчанд функсияҳои дарунсохтро дар Java Stream иҷро кунем.
-
Java Stream метавонад вурудро аз маҷмӯаҳои додаҳо ба монанди коллексияҳо ва массивҳо дар Java қабул кунад.
-
Java Stream тағир додани сохтори додаҳои вурудро талаб намекунад.
-
Java Stream манбаъро тағир намедиҳад. Ба ҷои ин, он бо истифода аз усулҳои мувофиқи қубур маҳсулот тавлид мекунад.
-
Ҷараёнҳои Java бояд ба амалиёти мобайнӣ ва терминалӣ, ки мо дар бахшҳои минбаъда муҳокима хоҳем кард.
-
Дар Java Stream, амалиётҳои фосилавӣ ба нақша гирифта шудаанд ва дар формати арзёбии танбал сурат мегиранд. Онҳо бо функсияҳои терминал хотима меёбанд. Ин формати асосиро барои истифодаи Java Stream ташкил медиҳад.
Эҷоди ҷараёни Java дар Java 8
Риштаҳои Java метавонанд бо чанд роҳ эҷод карда шаванд:1. Эҷоди ҷараёни холӣ бо истифода аз усули Stream.empty()
Шумо метавонед ҷараёни холӣ барои истифода дертар дар codeи худ эҷод кунед. Агар шумо усули Stream.empty() -ро истифода баред , ҷараёни холӣ тавлид мешавад, ки дорои арзиш надорад. Ин ҷараёни холӣ метавонад муфид бошад, агар мо мехоҳем, ки дар вақти корӣ истиснои нишоннамои нулро гузаред. Барои ин шумо метавонед фармони зеринро истифода баред:Stream<String> str = Stream.empty();
Изҳороти дар боло зикршуда ҷараёни холӣ бо номи str бе ягон унсур дар дохor он тавлид мекунад. Барои тасдиқи ин, танҳо бо истифода аз истилоҳи str.count() шумора ё андозаи ҷараёнро санҷед . Барои намуна,
System.out.println(str.count());
Дар натиҷа, мо дар баромад 0 мегирем .
2. Бо истифода аз усули Stream.builder() бо мисоли Stream.Builder ҷараён эҷод кунед
Мо инчунин метавонем Stream Builder-ро барои сохтани ҷараён бо истифода аз намунаи тарроҳии созанда истифода барем. Он барои пай дар пай сохтани an objectхо пешбинй шудааст. Биёед бубинем, ки чӣ тавр мо метавонем ҷараёнро бо истифода аз Stream Builder эҷод кунем .Stream.Builder<Integer> numBuilder = Stream.builder();
numBuilder.add(1).add(2).add( 3);
Stream<Integer> numStream = numBuilder.build();
Бо истифода аз ин code, шумо метавонед ҷараёнеро бо номи numStream эҷод кунед , ки дорои унсурҳои int мебошад . Ҳама чиз ба шарофати мисоли Stream.Builder бо номи numBuilder , ки аввал сохта шудааст, хеле зуд анҷом дода мешавад.
3. Бо истифода аз усули Stream.of() ҷараёнро бо арзишҳои муайяншуда эҷод кунед
Роҳи дигари эҷоди ҷараён истифодаи усули Stream.of() мебошад . Ин роҳи оддии эҷоди ҷараён бо арзишҳои додашуда аст. Он риштаро эълон мекунад ва инчунин оғоз мекунад. Намунаи истифодаи усули Stream.of() барои сохтани ҷараён:Stream<Integer> numStream = Stream.of(1, 2, 3);
Ин code ҷараёнеро эҷод мекунад, ки унсурҳои int дорад , ҳамон тавре ки мо дар усули қаблӣ бо истифода аз Stream.Builder кардаем . Дар ин ҷо мо мустақиман ҷараёнро бо истифода аз Stream.of() бо арзишҳои пешакӣ муайяншуда [1, 2 ва 3] эҷод кардем .
4. Бо истифода аз усули Arrays.stream() аз массиви мавҷуда ҷараён эҷод кунед
Усули дигари маъмул барои сохтани ришта истифодаи массивҳоро дар Java дар бар мегирад. Ҷараён дар ин ҷо аз массиви мавҷуда бо истифода аз усули Arrays.stream() сохта мешавад . Ҳама унсурҳои массив ба унсурҳои ҷараён табдил дода мешаванд. Инак як мисоли хуб:Integer[] arr = {1, 2, 3, 4, 5};
Stream<Integer> numStream = Arrays.stream(arr);
Ин code numStream-ро тавлид мекунад , ки дорои мундариҷаи массив бо номи arr аст, ки массиви бутун аст.
5. Якҷоя кардани ду ҷараёнҳои мавҷуда бо истифода аз усули Stream.concat()
Усули дигаре, ки барои эҷоди ҷараён истифода мешавад, ин усули Stream.concat() мебошад . Он барои якҷоя кардани ду ришта барои сохтани як ришта истифода мешавад. Ҳарду ҷараён бо тартиби муттаҳид карда мешаванд. Ин маънои онро дорад, ки риштаи аввал аввал меояд, риштаи дуюм ва ғайра. Намунаи чунин пайвастшавӣ чунин аст:Stream<Integer> numStream1 = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> numStream2 = Stream.of(1, 2, 3);
Stream<Integer> combinedStream = Stream.concat( numStream1, numStream2);
Изҳороти дар боло зикршуда ҷараёни ниҳоиро бо номи combinedStream эҷод мекунад , ки дорои унсурҳои ҷараёни якуми numStream1 ва ҷараёни дуюми numStream2- ро як ба як .
Намудҳои амалиёт бо Java Stream
Тавре ки аллакай зикр гардид, шумо метавонед бо Java Stream дар Java 8 ду намуди амалиётро иҷро кунед: миёна ва терминал. Биёед ба ҳар яки онҳо муфассалтар назар кунем.Амалиёти фосилавӣ
Амалиёти фосилавӣ ҷараёни баромадро тавлид мекунанд ва танҳо ҳангоми дучор шудан бо амалиёти терминал иҷро мешаванд. Ин маънои онро дорад, ки амалиёти мобайнӣ танбалӣ, қубурҳо иҷро карда мешавад ва танҳо тавассути амалиёти терминал анҷом дода мешавад. Шумо каме дертар дар бораи баҳодиҳии танбалӣ ва қубурҳо меомӯзед. Намунаҳои амалиёти мобайнӣ усулҳои зерин мебошанд: filter() , map() , different() , peek() , sorted() ва баъзе дигарон.Амалиётҳои терминал
Амалиётҳои терминал иҷрои амалиёти мобайниро ба анҷом мерасонанд ва инчунин натиҷаҳои ниҳоии ҷараёни баромадро бармегардонанд. Азбаски амалиёти терминал аз анҷоми иҷрои танбалӣ ва лӯлакашӣ шаҳодат медиҳад, ин ришта пас аз анҷоми амалиёти терминалӣ дубора истифода намешавад. Намунаҳои амалиёти терминалӣ усулҳои зерин мебошанд: forEach() , collect() , count() , reduce() ва ғайра.Намунаҳои амалиёт бо Java Stream
Амалиёти фосилавӣ
Инҳоянд чанд намунаи баъзе амалиёти фосилавӣ, ки метавонанд ба ҷараёни Java татбиқ карда шаванд:филтр ()
Ин усул барои филтр кардани унсурҳо аз ҷараён, ки ба предикати мушаххас дар Java мувофиқат мекунанд, истифода мешавад. Ин ҷузъҳои филтршуда баъдан ҷараёни навро ташкил медиҳанд. Барои беҳтар фаҳмидани он, биёед як мисолро дида бароем.Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> even = numStream.filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(even);
Хулоса:
харита()
Ин усул барои эҷоди ҷараёни нав тавассути иҷрои вазифаҳои хариташуда дар унсурҳои ҷараёни вуруди аслӣ истифода мешавад. Шояд ҷараёни нав дорои навъи дигари дода бошад. Намуна чунин менамояд:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> d = numStream.map(n -> n*2) .collect(Collectors.toList()); System.out.println(d);
Хулоса:
фарқ ()
Ин усул барои дарёфти танҳо унсурҳои алоҳида дар ҷараён тавассути филтр кардани нусхаҳои такрорӣ истифода мешавад. Намунаи ҳамон як чунин ба назар мерасад:Stream<Integer> numStream = Stream.of(43,65,1,98,63,63,1); List<Integer> numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList);
Хулоса:
назар ()
Ин усул барои пайгирии тағйироти фосилавӣ пеш аз иҷрои амалиёти терминал истифода мешавад. Ин маънои онро дорад, ки peek() метавонад барои иҷрои амалиёт дар ҳар як унсури ҷараён истифода шавад, то ҷараёнеро эҷод кунад, ки дар он амалиёти минбаъдаи фосилавӣ иҷро карда шавад.Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> nList = numStream.map(n -> n*10) .peek(n->System.out.println("Mapped: "+ n)) .collect(Collectors.toList()); System.out.println(nList);
Хулоса:
мураттаб ()
Усули sorted() барои ҷудо кардани унсурҳои ҷараён истифода мешавад. Бо нобаёнӣ, он элементҳоро бо тартиби афзоиш ҷудо мекунад. Шумо инчунин метавонед тартиби муайяни навъро ҳамчун параметр муайян кунед. Намунаи татбиқи ин усул чунин аст:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n));
Хулоса:
Амалиётҳои терминал
Инҳоянд чанд намунаи баъзе амалиёти терминал, ки метавонанд ба ҷараёнҳои Java татбиқ карда шаванд:forEach()
Усули forEach() барои такрор кардани ҳамаи унсурҳои ҷараён ва иҷро кардани функсия дар ҳар як элемент истифода мешавад. Ин ҳамчун алтернатива ба изҳороти даврӣ, ба монанди for , while ва дигарон амал мекунад. Мисол:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n));
Хулоса:
ҳисоб ()
Усули count() барои дарёфти шумораи умумии элементҳои дар ҷараёни мавҷудбуда истифода мешавад. Он ба усули size() монанд аст , ки аксар вақт барои муайян кардани шумораи умумии элементҳо дар коллексия истифода мешавад. Намунаи истифодаи усули count() бо Stream Java чунин аст:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count());
Хулоса:
ҷамъоварӣ ()
Усули collect() барои анҷом додани коҳиши тағйирёбандаи унсурҳои ҷараён истифода мешавад. Он метавонад барои нест кардани мундариҷа аз ҷараён пас аз анҷоми коркард истифода шавад. Он синфи Коллекторро барои иҷрои коҳишҳо истифода мебарад .Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> odd = numStream.filter(n -> n % 2 == 1) .collect(Collectors.toList()); System.out.println(odd);
Хулоса:
min() ва макс()
Усули min() , тавре ки аз ном бармеояд, метавонад дар ҷараён барои дарёфти элементи ҳадди ақал дар он истифода шавад. Ба ҳамин монанд, усули max() -ро барои дарёфти элементи максималӣ дар ҷараён истифода бурдан мумкин аст. Биёед кӯшиш кунем фаҳмем, ки чӣ гуна онҳоро бо мисол истифода бурдан мумкин аст:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); int smallest = numStream.min((m, n) -> Integer.compare(m, n)).get(); System.out.println("Smallest element: " + smallest);
numStream = Stream.of(43, 65, 1, 98, 63); int largest = numStream.max((m, n) -> Integer.compare(m, n)).get(); System.out.println("Largest element: " + largest);
Хулоса:
findAny() ва findFirst()
findAny() ҳама гуна унсури ҷараёнро ҳамчун ихтиёрӣ бармегардонад . Агар ҷараён холӣ бошад, он инчунин арзиши ихтиёриро бармегардонад , ки холӣ хоҳад буд. findFirst() унсури якуми ҷараёнро ҳамчун ихтиёрӣ бармегардонад . Мисли усули findAny() , усули findFirst() инчунин параметри ихтиёрии холиро бармегардонад , агар ҷараёни мувофиқ холӣ бошад. Биёед мисоли зеринро дар асоси ин усулҳо дида бароем:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); Optional<Integer> opt = numStream.findFirst();System.out.println(opt); numStream = Stream.empty(); opt = numStream.findAny();System.out.println(opt);
Хулоса:
allMatch() , anyMatch() ва noneMatch()
Усули allMatch() барои санҷидани он, ки оё ҳамаи унсурҳои ҷараён ба предикати муайян мувофиқат мекунанд, истифода мешавад ва арзиши мантиқии ҳақиқиро бармегардонад , агар онҳо мувофиқ бошанд, дар акси ҳол false -ро бармегардонад . Агар ҷараён холӣ бошад, он ҳақиқиро бармегардонад . Усули anyMatch() барои санҷидани он ки оё ягон унсури ҷараён ба предикати муайян мувофиқат мекунад, истифода мешавад. Агар ин тавр бошад, ҳақиқӣ , дар акси ҳол нодуруст бармегардад . Агар ҷараён холӣ бошад, он false -ро бармегардонад . Усули noneMatch() ҳақиқиро бармегардонад , агар ягон унсури ҷараён ба предикат мувофиқат накунад ва дар акси ҳол, нодуруст бошад . Намунае барои нишон додани ин чунин аст:Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); boolean flag = numStream.allMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.anyMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.noneMatch(n -> n==1);System.out.println(flag);
Хулоса:
Арзёбии танбал дар Java Stream
Арзёбии танбалӣ ҳангоми кор бо Java Streams дар Java 8 боиси оптимизатсия мегардад. Онҳо асосан ба таъхир андохтани амалиёти мобайнӣ то замони дучор омадани амалиёти терминал дар бар мегиранд. Арзёбии танбалӣ барои пешгирии исрофкории нолозими захираҳо дар ҳисобҳо то он даме, ки натиҷа воқеан лозим шавад, масъул аст. Ҷараёни баромаде, ки аз амалиёти мобайнӣ ба вуҷуд меояд, танҳо пас аз анҷоми амалиёти терминал тавлид мешавад. Арзёбии танбал бо тамоми амалиёти мобайнӣ дар ҷараёнҳои Java кор мекунад. Истифодаи хеле муфиди арзёбии танбал ҳангоми кор бо ҷараёнҳои беохир рух медиҳад. Бо ин роҳ, коркарди зиёди нодаркор пешгирӣ карда мешавад.Қубурҳо дар Java Stream
Қубур дар ҷараёни Java аз ҷараёни вуруд, сифр ё бештари амалиёти мобайнӣ, ки паси дигар ҷамъ шудаанд ва дар ниҳоят амалиёти терминалӣ иборат аст. Амалиёти фосилавӣ дар Java Streams танбал иҷро карда мешаванд. Ин амалиёти фосилавии қубурро ногузир месозад. Бо қубурҳо, ки асосан амалиётҳои мобайнӣ мебошанд, ки бо тартиб муттаҳид мешаванд, иҷрои танбал имконпазир мегардад. Қубурҳо барои пайгирии амалиёти фосилавӣ, ки бояд пас аз анҷоми амалиёти терминал анҷом дода шаванд, кӯмак мекунанд.Хулоса
Биёед ҳоло он чизеро, ки имрӯз омӯхтаем, ҷамъбаст кунем. Дар ин мақола:- Мо зуд дида баромадем, ки ҷараёнҳои Java чист.
- Сипас мо усулҳои гуногуни эҷоди риштаҳои Java дар Java 8-ро омӯхтем.
- Мо ду намуди асосии амалиётро (амалҳои мобайнӣ ва терминал) омӯхтем, ки онҳоро дар ҷараёнҳои Java иҷро кардан мумкин аст.
- Пас аз он мо якчанд мисоли амалиёти мобайнӣ ва терминалиро муфассал дида баромадем.
- Мо дар бораи арзёбии танбалӣ маълумоти бештар гирифтем ва дар ниҳоят дар бораи лӯлакашӣ дар риштаҳои Java омӯхтем.
GO TO FULL VERSION