JavaRush /Блоги Java /Random-TG /Кофе-брейк №177. Дастури муфассал барои Java Stream дар J...

Кофе-брейк №177. Дастури муфассал барои Java Stream дар Java 8

Дар гурӯҳ нашр шудааст
Сарчашма: Hackernoon Ин мақола як дастури муфассалро оид ба кор бо Java Stream дар баробари мисолҳо ва тавзеҳоти code пешниҳод мекунад. Кофе-брейк №177.  Дастури муфассал барои Java Stream дар Java 8 - 1

Муқаддима ба Java Threads дар Java 8

Java Streams, ки ҳамчун як қисми Java 8 муаррифӣ шудааст, барои кор бо ҷамъоварии маълумот истифода мешавад. Онҳо худи сохтори додаҳо нестанд, аммо метавонанд барои ворид кардани иттилоот аз дигар сохторҳои додаҳо тавассути фармоиш ва интиқол барои ба даст овардани натиҷаи ниҳоӣ истифода шаванд. Эзоҳ: Муҳим нест, ки Stream ва Threadро омехта накунед, зеро дар забони русӣ ҳарду истилоҳ аксар вақт дар як тарҷумаи “ҷараён” номида мешаванд. Ҷараён an objectро барои иҷрои амалиётҳо (аксар вақт интиқол ё нигоҳ доштани маълумот) ифода мекунад, дар ҳоле ки Thread (тарҷумаи аслӣ - ришта) an objectеро ифода мекунад, ки имкон медиҳад codeи муайяни барнома дар баробари шохаҳои дигари code иҷро карда шавад. Азбаски Stream сохтори алоҳидаи додаҳо нест, он ҳеҷ гоҳ манбаи маълумотро тағир намедиҳад. Ҷараёни Java дорои хусусиятҳои зерин мебошанд:
  1. Java Stream метавонад бо истифода аз бастаи "java.util.stream" истифода шавад. Онро бо истифода аз code ба скрипт ворид кардан мумкин аст:

    import java.util.stream.* ;

    Бо истифода аз ин code, мо инчунин метавонем ба осонӣ якчанд функсияҳои дарунсохтро дар Java Stream иҷро кунем.

  2. Java Stream метавонад вурудро аз маҷмӯаҳои додаҳо ба монанди коллексияҳо ва массивҳо дар Java қабул кунад.

  3. Java Stream тағир додани сохтори додаҳои вурудро талаб намекунад.

  4. Java Stream манбаъро тағир намедиҳад. Ба ҷои ин, он бо истифода аз усулҳои мувофиқи қубур маҳсулот тавлид мекунад.

  5. Ҷараёнҳои Java бояд ба амалиёти мобайнӣ ва терминалӣ, ки мо дар бахшҳои минбаъда муҳокима хоҳем кард.

  6. Дар Java Stream, амалиётҳои фосилавӣ ба нақша гирифта шудаанд ва дар формати арзёбии танбал сурат мегиранд. Онҳо бо функсияҳои терминал хотима меёбанд. Ин формати асосиро барои истифодаи Java Stream ташкил медиҳад.

Дар фасли оянда, мо усулҳои мухталиферо, ки дар Java 8 истифода мешаванд, барои эҷоди ҷараёни Java дар ҳолати зарурӣ дида мебароем.

Эҷоди ҷараёни 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);
Хулоса:
[98]
Шарҳ: Дар ин мисол, шумо мебинед, ки ҳатто элементҳо (ба 2 тақсим мешаванд) бо усули filter() филтр карда мешаванд ва дар рӯйхати бутуни numStream нигоҳ дошта мешаванд , ки мундариҷаи онҳо дертар чоп карда мешаванд. Азбаски 98 ягона адади ҷуфт дар ҷараён аст, он дар баромад чоп карда мешавад.

харита()

Ин усул барои эҷоди ҷараёни нав тавассути иҷрои вазифаҳои хариташуда дар унсурҳои ҷараёни вуруди аслӣ истифода мешавад. Шояд ҷараёни нав дорои навъи дигари дода бошад. Намуна чунин менамояд:
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);
Хулоса:
[86, 130, 2, 196, 126]
Шарҳ: Дар ин ҷо мо мебинем, ки усули map() барои дучанд кардани ҳар як унсури ҷараёни numStream истифода мешавад . Тавре ки шумо аз баромад мебинед, ҳар як элементи ҷараён бомуваффақият дучанд карда шудааст.

фарқ ()

Ин усул барои дарёфти танҳо унсурҳои алоҳида дар ҷараён тавассути филтр кардани нусхаҳои такрорӣ истифода мешавад. Намунаи ҳамон як чунин ба назар мерасад:
Stream<Integer> numStream = Stream.of(43,65,1,98,63,63,1); List<Integer> numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList);
Хулоса:
[43, 65, 1, 98, 63]
Шарҳ: Дар ин ҳолат, усули different() барои numStream истифода мешавад . Он ҳамаи унсурҳои алоҳидаро дар numList тавассути нест кардани такрорӣ аз ҷараён бармегардонад. Тавре ки шумо аз баромад мебинед, бар хилофи ҷараёни вуруд, ки дар аввал ду такрорӣ (63 ва 1) дошт, ягон такрор вуҷуд надорад.

назар ()

Ин усул барои пайгирии тағйироти фосилавӣ пеш аз иҷрои амалиёти терминал истифода мешавад. Ин маънои онро дорад, ки 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);
Хулоса:
Хариташуда: 430 Хариташуда: 650 Хариташуда: 10 Хариташуда: 980 Хариташуда: 630 [430, 650, 10, 980, 630]
Шарҳ: Дар ин ҷо усули peek() барои тавлиди натиҷаҳои мобайнӣ истифода мешавад, зеро усули map() ба унсурҳои ҷараён истифода мешавад. Дар ин ҷо мо метавонем мушоҳида кунем, ки ҳатто пеш аз истифодаи амалиёти терминали collect() барои чопи мундариҷаи ниҳоии рӯйхат дар изҳороти чоп , натиҷа барои ҳар як харитасозии унсури ҷараён пешакӣ пай дар пай чоп карда мешавад.

мураттаб ()

Усули sorted() барои ҷудо кардани унсурҳои ҷараён истифода мешавад. Бо нобаёнӣ, он элементҳоро бо тартиби афзоиш ҷудо мекунад. Шумо инчунин метавонед тартиби муайяни навъро ҳамчун параметр муайян кунед. Намунаи татбиқи ин усул чунин аст:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n));
Хулоса:
1 43 ​​63 65 98
Шарҳ: Дар ин ҷо усули sorted() барои ҷудо кардани унсурҳои ҷараён бо тартиби афзоиш ба таври нобаёнӣ истифода мешавад (зеро тартиби мушаххас муайян нашудааст). Шумо мебинед, ки ашёҳои дар баромад чопшуда бо тартиби афзоиш ҷойгир шудаанд.

Амалиётҳои терминал

Инҳоянд чанд намунаи баъзе амалиёти терминал, ки метавонанд ба ҷараёнҳои Java татбиқ карда шаванд:

forEach()

Усули forEach() барои такрор кардани ҳамаи унсурҳои ҷараён ва иҷро кардани функсия дар ҳар як элемент истифода мешавад. Ин ҳамчун алтернатива ба изҳороти даврӣ, ба монанди for , while ва дигарон амал мекунад. Мисол:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n));
Хулоса:
43 65 1 98 63
Шарҳ: Дар ин ҷо усули forEach() барои чопи ҳар як элементи ҷараён истифода мешавад.

ҳисоб ()

Усули count() барои дарёфти шумораи умумии элементҳои дар ҷараёни мавҷудбуда истифода мешавад. Он ба усули size() монанд аст , ки аксар вақт барои муайян кардани шумораи умумии элементҳо дар коллексия истифода мешавад. Намунаи истифодаи усули count() бо Stream Java чунин аст:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count());
Хулоса:
5
Шарҳ: Азбаски numStream дорои 5 унсури бутун мебошад, бо истифода аз усули count() дар он 5 мебарояд.

ҷамъоварӣ ()

Усули 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);
Хулоса:
[43, 65, 1, 63]
Шарҳ: Дар ин мисол, ҳама унсурҳои тоқ дар ҷараён филтр карда мешаванд ва ба рӯйхат бо номи 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);
Хулоса:
Элементи хурдтарин: 1 Элементи калонтарин: 98
Шарҳ: Дар ин мисол, мо хурдтарин элементро дар numStream бо истифода аз усули min() ва бузургтарин элементро бо усули max() чоп кардем . Аҳамият диҳед, ки дар ин ҷо пеш аз истифодаи усули max() мо бори дигар ба numStream элементҳоро илова кардем . Сабаб дар он аст, ки min() амалиёти терминалӣ буда, мундариҷаи ҷараёни аслиро нест мекунад ва танҳо натиҷаи ниҳоиро бармегардонад (ки дар ин ҳолат адади «хурдтарин» буд).

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);
Хулоса:
Ихтиёрӣ[43] Опсия.холӣ
Шарҳ: Дар ин ҷо, дар ҳолати аввал, усули findFirst() унсури якуми ҷараёнро ҳамчун Опсия бармегардонад . Сипас, вақте ки ришта ҳамчун риштаи холӣ аз нав таъин карда мешавад, усули findAny() холии Optional -ро бармегардонад .

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);
Хулоса:
дурӯғ ҳақиқӣ дурӯғ
Шарҳ: Барои ҷараёни numStream , ки 1-ро ҳамчун унсур дорад, усули allMatch() бардурӯғ бармегардонад , зеро ҳамаи элементҳо 1 нестанд, балки танҳо яке аз онҳост. Усули anyMatch() ҳақиқиро бармегардонад , зеро ҳадди аққал яке аз унсурҳо 1 аст. Усули noneMatch() нодурустро бармегардонад , зеро 1 воқеан ҳамчун элемент дар ин ҷараён мавҷуд аст.

Арзёбии танбал дар Java Stream

Арзёбии танбалӣ ҳангоми кор бо Java Streams дар Java 8 боиси оптимизатсия мегардад. Онҳо асосан ба таъхир андохтани амалиёти мобайнӣ то замони дучор омадани амалиёти терминал дар бар мегиранд. Арзёбии танбалӣ барои пешгирии исрофкории нолозими захираҳо дар ҳисобҳо то он даме, ки натиҷа воқеан лозим шавад, масъул аст. Ҷараёни баромаде, ки аз амалиёти мобайнӣ ба вуҷуд меояд, танҳо пас аз анҷоми амалиёти терминал тавлид мешавад. Арзёбии танбал бо тамоми амалиёти мобайнӣ дар ҷараёнҳои Java кор мекунад. Истифодаи хеле муфиди арзёбии танбал ҳангоми кор бо ҷараёнҳои беохир рух медиҳад. Бо ин роҳ, коркарди зиёди нодаркор пешгирӣ карда мешавад.

Қубурҳо дар Java Stream

Қубур дар ҷараёни Java аз ҷараёни вуруд, сифр ё бештари амалиёти мобайнӣ, ки паси дигар ҷамъ шудаанд ва дар ниҳоят амалиёти терминалӣ иборат аст. Амалиёти фосилавӣ дар Java Streams танбал иҷро карда мешаванд. Ин амалиёти фосилавии қубурро ногузир месозад. Бо қубурҳо, ки асосан амалиётҳои мобайнӣ мебошанд, ки бо тартиб муттаҳид мешаванд, иҷрои танбал имконпазир мегардад. Қубурҳо барои пайгирии амалиёти фосилавӣ, ки бояд пас аз анҷоми амалиёти терминал анҷом дода шаванд, кӯмак мекунанд.

Хулоса

Биёед ҳоло он чизеро, ки имрӯз омӯхтаем, ҷамъбаст кунем. Дар ин мақола:
  1. Мо зуд дида баромадем, ки ҷараёнҳои Java чист.
  2. Сипас мо усулҳои гуногуни эҷоди риштаҳои Java дар Java 8-ро омӯхтем.
  3. Мо ду намуди асосии амалиётро (амалҳои мобайнӣ ва терминал) омӯхтем, ки онҳоро дар ҷараёнҳои Java иҷро кардан мумкин аст.
  4. Пас аз он мо якчанд мисоли амалиёти мобайнӣ ва терминалиро муфассал дида баромадем.
  5. Мо дар бораи арзёбии танбалӣ маълумоти бештар гирифтем ва дар ниҳоят дар бораи лӯлакашӣ дар риштаҳои Java омӯхтем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION