JavaRush /Java Blog /Random-TK /Kofe arakesmesi # 177. Java 8-de Java akymy barada jikme-...

Kofe arakesmesi # 177. Java 8-de Java akymy barada jikme-jik gollanma

Toparda çap edildi
Çeşme: Hackernoon Bu ýazgy, kod mysallary we düşündirişleri bilen birlikde Java Stream bilen işlemek barada jikme-jik sapak berýär. Kofe arakesmesi # 177.  Java 8 - 1-de Java akymy barada jikme-jik gollanma

Java 8-de Java sapaklary bilen tanyşlyk

“Java 8” -iň bir bölegi hökmünde hödürlenen “Java Streams” maglumatlar ýygyndysy bilen işlemek üçin ulanylýar. Maglumatlaryň gurluşy däl, ýöne ahyrky netijäni bermek üçin sargyt we turba geçiriji arkaly beýleki maglumatlar gurluşlaryndan maglumat girizmek üçin ulanylyp bilner. Bellik: Akym we mowzugy bulaşdyrmazlyk möhümdir, sebäbi rus dilinde iki adalga köplenç şol bir terjime "akym" diýilýär. Akym amallary ýerine ýetirmek üçin obýekti aňladýar (köplenç maglumatlary geçirmek ýa-da saklamak), sapak (sözme-söz terjime - sapak) belli bir programma kodunyň beýleki kod şahalary bilen paralel ýerine ýetirilmegine mümkinçilik berýän obýekti aňladýar. Akym aýratyn maglumat gurluşy däldigi sebäpli, maglumat çeşmesini hiç wagt üýtgetmeýär. Java akymlarynyň aşakdaky aýratynlyklary bar:
  1. Java akymy “java.util.stream” bukjasy arkaly ulanylyp bilner. Kod ulanyp, skriptiň içine getirip bolýar:

    import java.util.stream.* ;

    Bu kody ulanyp, Java Stream-da gurlan birnäçe funksiýany aňsatlyk bilen amala aşyryp bileris.

  2. Java Stream, Java-daky kolleksiýalar we massiwler ýaly maglumat ýygyndylaryndan giriş kabul edip biler.

  3. Java Stream giriş maglumatlarynyň gurluşyny üýtgetmegi talap etmeýär.

  4. Java akymy çeşmäni üýtgetmeýär. Munuň ýerine degişli turbageçiriji usullaryny ulanyp önüm öndürýär.

  5. Java akymlary aralyk we terminal amallaryna degişlidir, indiki bölümlerde ara alyp maslahatlaşarys.

  6. “Java Stream” -da aralyk amallar geçirilýär we ýalta baha beriş görnüşinde bolýar. Terminal funksiýalary bilen gutarýarlar. Bu Java akymyny ulanmak üçin esasy formaty emele getirýär.

Indiki bölümde, zerur bolanda we Java akymy döretmek üçin Java 8-de ulanylýan dürli usullara serederis.

Java 8-de Java akymy döretmek

Java sapaklaryny birnäçe usul bilen döredip bolýar:

1. Stream.empty () usuly bilen boş akym döretmek

Kodyňyzda soň ulanmak üçin boş akym döredip bilersiňiz. Stream.empty () usulyny ulansaňyz , hiç hili gymmaty bolmadyk boş akym dörediler. Iş wagty boş görkeziji kadadan çykmak islesek, bu boş akym peýdaly bolup biler. Munuň üçin aşakdaky buýrugy ulanyp bilersiňiz:
Stream<String> str = Stream.empty();
Aboveokardaky jümle , içindäki elementler bolmazdan str atly boş akym döreder . Muny barlamak üçin diňe str.count () adalgasyny ulanyp akymyň sanyny ýa-da ululygyny barlaň . Mysal üçin,
System.out.println(str.count());
Netijede, çykyşda 0 alarys .

2. Stream.Builder mysaly bilen Stream.builder () usuly bilen akym dörediň

Şeýle hem , gurluşykçynyň dizaýn nagşyny ulanyp akym döretmek üçin “Stream Builder” -i ulanyp bileris . Obýektleriň ädimme-ädim gurulmagy üçin niýetlenendir. “Stream Builder” -i ulanyp, akymy nädip çaltlaşdyryp boljakdygyny göreliň .
Stream.Builder<Integer> numBuilder = Stream.builder();

numBuilder.add(1).add(2).add( 3);

Stream<Integer> numStream = numBuilder.build();
Bu kody ulanyp, int elementlerini öz içine alýan numStream atly akym döredip bilersiňiz . Hemme zat ilki döredilen “numBuilder” diýlip atlandyrylýan “Stream.Builder” mysaly sebäpli gaty çalt ýerine ýetirilýär .

3. Stream.of () usuly bilen görkezilen bahalar bilen akym dörediň

Akym döretmegiň başga bir usuly, Stream.of () usulyny ulanmagy öz içine alýar . Berlen bahalar bilen akym döretmegiň ýönekeý usuly. Sapagy yglan edýär we başlaýar. Akym döretmek üçin Stream.of () usulyny ulanmagyň mysaly:
Stream<Integer> numStream = Stream.of(1, 2, 3);
Bu kod, Stream.Builder ulanyp, öňki usulda edişimiz ýaly int elementlerini öz içine alýan akym döreder . Bu ýerde gönüden-göni kesgitlenen bahalar bilen Stream.of () ulanyp akym döretdik [1, 2 we 3] .

4. Arrays.stream () usuly bilen bar bolan massiwden akym dörediň

Bir sapak döretmek üçin başga bir umumy usul, Java-da massiwleri ulanmagy öz içine alýar. Bu ýerdäki akym, Arrays.stream () usuly bilen bar bolan massiwden döredilýär . Arhli massiw elementleri akym elementlerine öwrülýär. Ine gowy mysal:
Integer[] arr = {1, 2, 3, 4, 5};

Stream<Integer> numStream = Arrays.stream(arr);
Bu kody bitewi massiw bolan arr atly massiwiň mazmunyny öz içine alýan numStream döreder .

5. Stream.concat () usuly bilen bar bolan iki akymy birleşdirmek

Akym döretmek üçin ulanyp boljak başga bir usul, Stream.concat () usulydyr . Bir sapak döretmek üçin iki sapagy birleşdirmek üçin ulanylýar. Iki akym hem tertipde birleşdirildi. Diýmek, birinji sapak ilki gelýär, soň ikinji sapak gelýär we ş.m. Şeýle birleşmäniň mysaly şuňa meňzeýär:
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);
Aboveokardaky jümle, birinji akym numStream1 we ikinji akym numStream2 elementlerini öz içine alýan kombinirlenen akym atly soňky akym döreder .

Java akymy bilen amallaryň görnüşleri

Öň bellenip geçilişi ýaly, Java 8-de Java Stream bilen iki görnüşli amal edip bilersiňiz: aralyk we terminal. Geliň, olaryň hersine has jikme-jik seredeliň.

Aralyk amallar

Aralyk amallar çykyş akymyny döredýär we diňe terminal amaly bilen ýüzbe-ýüz bolanda ýerine ýetirilýär. Bu, aralyk amallaryň ýalta, turbageçiriji bilen ýerine ýetirilýändigini we diňe terminal amallary bilen tamamlanyp biljekdigini aňladýar. Lazalta baha bermek we turbageçiriji barada biraz soň öwrenersiňiz. Aralyk amallara mysallar aşakdaky usullar: süzgüç () , karta () , dürli () , peek () , sortlanan () we başgalar.

Terminal amallary

Terminal amallary aralyk amallaryň ýerine ýetirilmegini tamamlaýar we çykyş akymynyň soňky netijelerini yzyna berýär. Terminal amallary ýalta ýerine ýetirişiň we turbageçirijiniň gutarandygyny görkezýänligi sebäpli, bu sapak terminal amalyndan soň gaýtadan ulanylyp bilinmez. Terminal amallaryna mysallar aşakdaky usullar: forEach () , ýygnamak () , sanamak () , azaltmak () we ş.m.

Java Stream bilen amallaryň mysallary

Aralyk amallar

Java akymyna ulanyp boljak käbir aralyk amallaryň käbir mysallary:

süzgüç ()

Bu usul, Java-da belli bir predikata gabat gelýän akymdan elementleri süzmek üçin ulanylýar. Bu süzülen zatlar soň täze akym emele getirýär. Has gowy düşünmek üçin bir mysala göz aýlalyň.
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);
Netije:
[98]
Düşündiriş: Bu mysalda, hatda elementleriň (2-ä bölünýän) süzgüç () usuly bilen süzülendigini we mazmuny soň çap edilýän numStream bitewi sanawynda saklanýandygyny görüp bilersiňiz . 98 akymdaky ýeke-täk bitewi san bolansoň, çykyşda çap edilýär.

karta ()

Bu usul, asyl giriş akymynyň elementlerinde kartalaşdyrylan funksiýalary ýerine ýetirip, täze akym döretmek üçin ulanylýar. Täze akymyň başga bir maglumat görnüşi bar bolsa gerek. Mysal şuňa meňzeýär:
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);
Netije:
[86, 130, 2, 196, 126]
Düşündiriş: Bu ýerde karta () usulynyň numStream akymynyň her elementini iki esse köpeltmek üçin ulanylýandygyny görýäris . Çykyşdan görnüşi ýaly, akymdaky elementleriň her biri üstünlikli iki esse köpeldi.

tapawutly ()

Bu usul, dublikatlary süzüp, akymdaky diňe aýratyn elementleri almak üçin ulanylýar. Muňa meňzeş bir mysal:
Stream<Integer> numStream = Stream.of(43,65,1,98,63,63,1); List<Integer> numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList);
Netije:
[43, 65, 1, 98, 63]
Düşündiriş: Bu ýagdaýda numStream üçin dürli () usul ulanylýar . Akymdan dublikatlary aýyrmak bilen numList-de ähli aýratyn elementleri alýar . Çykyşdan görnüşi ýaly, başda iki dublikaty bolan giriş akymyndan tapawutlylykda hiç hili dublikat ýok (63 we 1).

peek ()

Bu usul terminal amalyny ýerine ýetirmezden ozal aralyk üýtgeşmeleri yzarlamak üçin ulanylýar. Diýmek, peek () akymyň her elementinde amal etmek üçin, aralyk amallary ýerine ýetirip boljak akym döretmek üçin ulanylyp bilner.
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);
Netije:
Kartalaşdyrylan: 430 Kartalaşdyrylan: 650 Kartalaşdyrylan: 10 Kartalaşdyrylan: 980 Kartalaşdyrylan: 630 [430, 650, 10, 980, 630]
Düşündiriş: Bu ýerde peek () usuly aralyk netijelerini döretmek üçin ulanylýar, sebäbi kartanyň () usuly akymyň elementlerine ulanylýar. Bu ýerde sanawyň soňky mazmunyny çap beýanynda çap etmek üçin ýygnamak () terminal amalyny ulanmazdan ozal , her akym elementini kartalaşdyrmagyň netijesiniň yzygiderli çap edilýändigini görüp bileris .

sortlanan ()

Saýlanan () usuly akymyň elementlerini tertiplemek üçin ulanylýar. Düzgüne görä, elementleri ýokarlanýan tertipde tertipleýär. Şeýle hem belli bir tertip tertibini parametr hökmünde kesgitläp bilersiňiz. Bu usulyň durmuşa geçirilmegi mysal:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n));
Netije:
1 43 ​​63 65 98
Düşündiriş: Bu ýerde sortlanan () usuly akymyň elementlerini ýokarlanýan tertipde tertiplemek üçin ulanylýar (belli bir tertip görkezilmänsoň). Çykyşda çap edilen zatlaryň ýokarlanýan tertipde ýerleşdirilendigini görüp bilersiňiz.

Terminal amallary

Java akymlaryna ulanyp boljak käbir terminal amallarynyň käbir mysallary:

her biri üçin()

ForEach () usuly akymyň ähli elementlerini gaýtalamak we her elementdäki funksiýany birin-birin ýerine ýetirmek üçin ulanylýar. Bu , beýlekiler we beýlekiler ýaly aýlawly jümlelere alternatiwa hökmünde çykyş edýär . Mysal:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n));
Netije:
43 65 1 98 63
Düşündiriş: Bu ýerde akymyň her elementini birin-birin çap etmek üçin forEach () usuly ulanylýar.

san ()

Hasap () usuly akymda bar bolan elementleriň umumy sanyny almak üçin ulanylýar. Kolleksiýadaky elementleriň umumy sanyny kesgitlemek üçin köplenç ulanylýan ululyk () usulyna meňzeýär . Java akymy bilen sanamak () usulyny ulanmagyň mysaly aşakdakylar:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count());
Netije:
5
Düşündiriş: numStream- de 5 sany bitewi element bar bolany üçin, onda sanamak () usulyny ulanyp 5 çykar.

ýygnamak ()

Collygnamak () usuly akym elementleriniň üýtgäp bilýän azalmalaryny ýerine ýetirmek üçin ulanylýar. Gaýtadan işlemek gutarandan soň mazmuny akymdan aýyrmak üçin ulanylyp bilner. Azaltmak üçin Kollektor synpyny ulanýar .
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);
Netije:
[43, 65, 1, 63]
Düşündiriş: Bu mysalda akymdaky ähli täsin elementler süzülýär we ýygnalýar / täsin sanawda azalýar . Ahyrynda täsinleriň sanawy çap edilýär.

min () we max ()

Min () usuly , adyndan görnüşi ýaly, içindäki iň pes elementi tapmak üçin akymda ulanylyp bilner. Şonuň ýaly-da, akymda iň ýokary elementi tapmak üçin max () usuly ulanylyp bilner. Mysal bilen nädip ulanyp boljakdygyna düşünmäge synanyşalyň:
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);
Netije:
Iň kiçi element: 1 Iň uly element: 98
Düşündiriş: Bu mysalda, min () usuly bilen numStream-iň iň kiçi elementini we max ( ) usuly bilen iň uly elementi çap etdik . Üns beriň, bu ýerde max () usulyny ulanmazdan ozal numStream -e elementleri goşduk . Sebäbi min () terminal işleýşidir we asyl akymyň mazmunyny ýok edýär, diňe soňky netijäni gaýtaryp berýär (bu ýagdaýda bitewi “iň kiçi”).

FindAny () we findFirst ()

findAny () akymyň islendik elementini islege görä gaýtaryp berýär . Akym boş bolsa, boş boljak goşmaça bahany hem yzyna getirer . findFirst () akymyň birinji elementini islege görä gaýtaryp berýär . FindAny () usulyndaky ýaly , findFirst () usuly hem degişli akym boş bolsa, boş islege bagly parametri yzyna berýär. Bu usullara esaslanýan aşakdaky mysala göz aýlalyň:
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);
Netije:
Meýletin [43] Meýletin.empty
Düşündiriş: Ine, ilkinji ýagdaýda findFirst () usuly akymyň birinji elementini islege görä gaýtaryp berýär . Soňra, sapak boş sapak hökmünde täzeden bellenilende, findAny () usuly boş islege gaýtarylýar .

allMatch () , anyMatch () we noneMatch ()

AllMatch () usuly, akymdaky ähli elementleriň belli bir predikata gabat gelýändigini ýa-da ýerine ýetirilse, bahanyň hakykylygyny yzyna gaýtarmak üçin ulanylýar, ýogsam ýalňyş yzyna gaýtarylýar . Akym boş bolsa, hakykata gaýdyp gelýär . AnyMatch () usuly, akymdaky elementleriň haýsydyr biriniň belli bir predikata laýyk gelýändigini barlamak üçin ulanylýar. Başga bolsa ýalan bolsa, hakyky bolýar . Akym boş bolsa, ýalan gaýdyp gelýär . Akymdaky hiç bir element öňküsi bilen gabat gelmeýän bolsa, başgaça ýalňyş bolsa , noneMatch () usuly hakyky bolýar . Muny görkezmek üçin bir mysal şeýle:
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);
Netije:
ýalan hakyky ýalan
Düşündiriş: 1 elementi öz içine alýan numStream akymy üçin allMatch () usuly ýalňyş gaýdyp gelýär , sebäbi ähli elementler 1 däl, ýöne diňe biri. AnyMatch () usuly hakykata gaýdyp gelýär , sebäbi elementleriň iň bolmanda biri 1. NoneMatch () usuly ýalňyş gaýtarylýar , sebäbi 1 bu akymda element hökmünde bar.

Java akymynda ýalta baha bermek

Azyalta baha bermek, Java 8-de Java akymlary bilen işleýän wagtyňyz optimizasiýa getirýär, esasan, terminal amallary ýüze çykýança aralyk amallary gijikdirmegi öz içine alýar. Azyalta baha bermek, netije zerur bolýança hasaplamalarda çeşmeleriň gereksiz isrip edilmeginiň öňüni alýar. Aralyk amallaryň netijesinde çykýan akym diňe terminal işi gutarandan soň döredilýär. Yalta baha bermek, Java akymlaryndaky ähli aralyk amallar bilen işleýär. Çekimsiz akymlar bilen işleýän wagtyňyz ýalta baha bermegiň örän peýdaly ulanylyşy ýüze çykýar. Şeýlelik bilen, köp gereksiz gaýtadan işlemegiň öňüni alýar.

Java akymynda turbalar

Java akymyndaky turbageçiriji giriş akymyndan, yzly-yzyna hatara düzülen nol ýa-da has köp aralyk amallaryndan we ahyrynda terminal işinden ybaratdyr. Java akymlarynda aralyk amallar ýalta ýerine ýetirilýär. Bu turbageçiriji aralyk amallary gutulgysyz edýär. Esasan aralyk amallar bolan turbageçirijiler bilen bilelikde ýalta ýerine ýetirmek mümkin bolýar. Turbageçirijiler, ahyrky amaldan soň ýerine ýetirilmeli aralyk amallary yzarlamaga kömek edýär.

Netije

Geliň, şu gün öwrenenlerimizi jemläliň. Bu makalada:
  1. Java akymlarynyň nämedigine gysga göz aýladyk.
  2. Soňra Java 8-de Java sapaklaryny döretmek üçin köp dürli usullary öwrendik.
  3. Java akymlarynda ýerine ýetirip boljak iki esasy amal görnüşini (aralyk amallar we terminal amallary) öwrendik.
  4. Soňra aralyk we terminal amallarynyň birnäçe mysallaryna jikme-jik göz aýladyk.
  5. Lazalta baha bermek hakda has köp zat öwrendik we ahyrynda Java sapaklarynda turba geçiriji hakda öwrendik.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION