JavaRush /Blog Jawa /Random-JV /Ngopi #177. Pandhuan rinci babagan Java Stream ing Jawa 8...

Ngopi #177. Pandhuan rinci babagan Java Stream ing Jawa 8

Diterbitake ing grup
Sumber: Hackernoon Kiriman iki menehi tutorial rinci babagan nggarap Java Stream bebarengan karo conto kode lan panjelasan. Ngopi #177.  Pandhuan Rinci kanggo Java Stream ing Jawa 8 - 1

Pambuka Utas Jawa ing Basa Jawa 8

Java Streams, dikenalaké minangka bagéan saka Java 8, digunakake kanggo nggarap kumpulan data. Dheweke dudu struktur data dhewe, nanging bisa digunakake kanggo input informasi saka struktur data liyane kanthi pesenan lan pipelining kanggo ngasilake asil pungkasan. Cathetan: Penting ora kanggo mbingungake Stream lan Thread, amarga ing basa Rusia loro istilah kasebut asring diarani ing terjemahan sing padha "aliran". Stream nuduhake obyek kanggo nindakake operasi (paling asring nransfer utawa nyimpen data), nalika Utas (terjemahan literal - thread) nuduhake obyek sing ngidini kode program tartamtu bisa dieksekusi bebarengan karo cabang kode liyane. Amarga Stream dudu struktur data sing kapisah, mula ora bakal ngganti sumber data. Alur Jawa nduweni fitur ing ngisor iki:
  1. Java Stream bisa digunakake nggunakake paket "java.util.stream". Bisa diimpor menyang skrip nggunakake kode:

    import java.util.stream.* ;

    Nggunakake kode iki, kita uga bisa kanthi gampang ngleksanakake sawetara fungsi sing dibangun ing Java Stream.

  2. Java Stream bisa nampa input saka kumpulan data kayata kumpulan lan array ing Jawa.

  3. Java Stream ora mbutuhake ngganti struktur data input.

  4. Java Stream ora ngganti sumber. Nanging, ngasilake output nggunakake metode pipa sing cocog.

  5. Java Streams tundhuk operasi penengah lan terminal, sing bakal kita rembugan ing bagean ing ngisor iki.

  6. Ing Java Stream, operasi penengah disambungake lan kedadeyan ing format evaluasi sing males. Padha mungkasi karo fungsi terminal. Iki minangka format dhasar kanggo nggunakake Java Stream.

Ing bagean sabanjure, kita bakal ndeleng macem-macem cara sing digunakake ing Java 8 kanggo nggawe Java Stream nalika dibutuhake.

Nggawe Java Stream ing Jawa 8

Utas Jawa bisa digawe kanthi sawetara cara:

1. Nggawe stream kosong nggunakake Stream.empty () cara

Sampeyan bisa nggawe stream kosong kanggo nggunakake mengko ing kode. Yen sampeyan nggunakake cara Stream.empty () , stream kosong bakal kui, ora ngemot nilai. Aliran kosong iki bisa migunani yen kita pengin ngliwati pangecualian pointer null nalika runtime. Kanggo nindakake iki, sampeyan bisa nggunakake printah ing ngisor iki:
Stream<String> str = Stream.empty();
Pernyataan ing ndhuwur bakal ngasilake stream kosong sing jenenge str tanpa ana unsur ing njero. Kanggo verifikasi iki, mung mriksa nomer utawa ukuran stream nggunakake istilah str.count () . Tuladhane,
System.out.println(str.count());
Akibaté, kita entuk 0 ing output .

2. Nggawe stream nggunakake Stream.builder () cara karo Kayata Stream.Builder

Kita uga bisa nggunakake Stream Builder kanggo nggawe stream nggunakake pola desain builder. Iki dirancang kanggo langkah-langkah konstruksi obyek. Ayo ndeleng carane kita bisa instantiate stream nggunakake Stream Builder .
Stream.Builder<Integer> numBuilder = Stream.builder();

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

Stream<Integer> numStream = numBuilder.build();
Nggunakake kode iki, sampeyan bisa nggawe stream jenenge numStream ngemot unsur int . Kabeh wis rampung cukup cepet thanks kanggo Stream.Builder Kayata disebut numBuilder sing digawe pisanan.

3. Nggawe stream kanthi nilai sing ditemtokake nggunakake metode Stream.of ().

Cara liya kanggo nggawe stream yaiku nggunakake metode Stream.of() . Iki minangka cara sing gampang kanggo nggawe stream kanthi nilai sing diwenehake. Iki ngumumake lan uga miwiti thread. Conto nggunakake cara Stream.of() kanggo nggawe stream:
Stream<Integer> numStream = Stream.of(1, 2, 3);
Kode iki bakal nggawe stream sing ngemot unsur int , kaya sing ditindakake ing cara sadurunge nggunakake Stream.Builder . Ing kene kita langsung nggawe stream nggunakake Stream.of() kanthi nilai sing wis ditemtokake [1, 2 lan 3] .

4. Nggawe stream saka Uploaded ana nggunakake Arrays.stream () cara

Cara umum liyane kanggo nggawe utas yaiku nggunakake array ing Jawa. Stream kene digawe saka Uploaded ana nggunakake Arrays.stream () cara . Kabeh unsur array diowahi dadi unsur stream. Iki conto sing apik:
Integer[] arr = {1, 2, 3, 4, 5};

Stream<Integer> numStream = Arrays.stream(arr);
Kode iki bakal ngasilake numStream sing ngemot isi array sing diarani arr, yaiku array integer.

5. Nggabungake loro lepen ana nggunakake Stream.concat () cara

Cara liya sing bisa digunakake kanggo nggawe stream punika Stream.concat () cara . Iki digunakake kanggo nggabungake rong benang kanggo nggawe benang siji. Loro-lorone aliran digabungake kanthi urutan. Tegese utas kapisan dadi luwih dhisik, banjur benang kapindho, lan sateruse. Conto concatenation kaya iki:
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);
Pernyataan ing ndhuwur bakal nggawe stream pungkasan sing dijenengi combinedStream sing ngemot unsur aliran pertama numStream1 lan aliran kapindho numStream2 siji-siji .

Jinis operasi karo Java Stream

Kaya sing wis kasebut, sampeyan bisa nindakake rong jinis operasi karo Java Stream ing Java 8: penengah lan terminal. Ayo ndeleng saben wong kanthi luwih rinci.

Operasi penengah

Operasi penengah ngasilake stream output lan dieksekusi mung nalika nemoni operasi terminal. Iki tegese operasi penengah dieksekusi kanthi kesed, pipelined, lan mung bisa rampung kanthi operasi terminal. Sampeyan bakal sinau babagan evaluasi kesed lan pipelining mengko. Conto operasi penengah yaiku cara ing ngisor iki: saringan () , map () , beda () , Ndeleng () , diurutake () lan sawetara liyane.

Operasi Terminal

Operasi terminal ngrampungake eksekusi operasi penengah lan uga ngasilake asil pungkasan saka aliran output. Amarga operasi terminal menehi tandha pungkasane eksekusi kesed lan pipelining, thread iki ora bisa digunakake maneh sawise wis ngalami operasi terminal. Conto operasi terminal cara ing ngisor iki: forEach () , ngumpulake () , count () , nyuda () lan ing.

Conto operasi karo Java Stream

Operasi penengah

Ing ngisor iki sawetara conto sawetara operasi penengah sing bisa ditrapake ing Java Stream:

saringan()

Cara iki digunakake kanggo nyaring unsur saka stream sing cocog karo predikat tartamtu ing Jawa. Item sing disaring iki banjur nggawe aliran anyar. Ayo goleki conto supaya luwih ngerti.
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);
Kesimpulan:
[98]
Panjelasan: Ing conto iki, sampeyan bisa ndeleng sing malah unsur (dibagi dening 2) disaring nggunakake cara Filter () lan disimpen ing dhaftar integer numStream , isi kang dicithak mengko. Wiwit 98 minangka siji-sijine integer sing ana ing stream kasebut, dicithak ing output.

peta()

Cara iki digunakake kanggo nggawe stream anyar kanthi nglakokake fungsi sing dipetakan ing unsur aliran input asli. Mbok stream anyar wis jinis data beda. Conto katon kaya iki:
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);
Kesimpulan:
[86, 130, 2, 196, 126]
Panjelasan: Ing kene kita weruh yen metode map () digunakake kanggo mung pindho saben unsur saka stream numStream . Nalika sampeyan bisa ndeleng saka output, saben unsur ing stream wis kasil tikel kaping pindho.

beda ()

Cara iki digunakake kanggo njupuk mung unsur individu ing stream kanthi nyaring duplikat. Conto sing padha katon kaya iki:
Stream<Integer> numStream = Stream.of(43,65,1,98,63,63,1); List<Integer> numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList);
Kesimpulan:
[43, 65, 1, 98, 63]
Panjelasan: Ing kasus iki, cara sing beda () digunakake kanggo numStream . Iki njupuk kabeh unsur individu ing numList kanthi mbusak duplikat saka stream. Minangka sampeyan bisa ndeleng saka output, ora ana duplikat, ora kaya aliran input, sing wiwitane duwe rong duplikat (63 lan 1).

ngintip()

Cara iki digunakake kanggo nglacak owah-owahan penengah sadurunge nglakokake operasi terminal. Iki tegese Ndeleng () bisa digunakake kanggo nindakake operasi ing saben unsur stream kanggo nggawe stream kang operasi penengah luwih bisa dileksanakake.
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);
Kesimpulan:
Peta: 430 Peta: 650 Peta: 10 Peta: 980 Peta: 630 [430, 650, 10, 980, 630]
Panjelasan: Ing kene cara ngintip () digunakake kanggo ngasilake asil penengah minangka metode peta () ditrapake kanggo unsur-unsur stream. Kene kita bisa sok dong mirsani sing malah sadurunge nggunakake ngumpulake () operasi terminal kanggo print isi final saka dhaftar ing statement print , asil kanggo saben pemetaan unsur stream dicithak sequentially ing advance.

diurutake ()

Cara sorted () digunakake kanggo ngurutake unsur stream. Kanthi gawan, ngurutake unsur ing urutan munggah. Sampeyan uga bisa nemtokake urutan urutan tartamtu minangka parameter. Conto implementasine metode iki katon kaya iki:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n));
Kesimpulan:
1 43 ​​63 65 98
Panjelasan: Ing kene, cara diurutake () digunakake kanggo ngurutake unsur-unsur aliran kanthi urutan munggah kanthi standar (amarga ora ana urutan tartamtu). Sampeyan bisa ndeleng manawa item sing dicithak ing output disusun kanthi urutan munggah.

Operasi Terminal

Ing ngisor iki sawetara conto sawetara operasi terminal sing bisa ditrapake ing aliran Java:

kanggo Saben()

Cara forEach () digunakake kanggo mbaleni liwat kabeh unsur stream lan nglakokaké fungsi ing saben unsur siji. Iki minangka alternatif kanggo statement loop kayata for , while lan liya-liyane. Tuladha:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n));
Kesimpulan:
43 65 1 98 63
Panjelasan: Ing kene cara forEach () digunakake kanggo nyithak saben unsur stream siji-siji.

ngitung()

Cara count () digunakake kanggo njupuk nomer total unsur sing ana ing stream. Iku padha karo ukuran () cara , kang asring digunakake kanggo nemtokake nomer total unsur ing koleksi. Conto nggunakake metode count() karo Java Stream kaya ing ngisor iki:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count());
Kesimpulan:
5
Panjelasan: Amarga numStream ngemot 5 unsur integer, nggunakake metode count() bakal ngasilake 5.

ngumpul()

Cara nglumpukake () digunakake kanggo nindakake mutable abang unsur stream. Bisa digunakake kanggo mbusak konten saka stream sawise proses rampung. Iki nggunakake kelas Kolektor kanggo nindakake pangurangan .
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);
Kesimpulan:
[43, 65, 1, 63]
Panjelasan: Ing conto iki, kabeh unsur aneh ing stream disaring lan diklumpukake / dikurangi dadi dhaptar sing jenenge ganjil . Ing pungkasan, dhaptar sing aneh dicithak.

min() lan maks()

Cara min () , minangka jeneng tabet, bisa digunakake ing stream kanggo nemokake unsur minimal ing. Kajaba iku, cara max () bisa digunakake kanggo nemokake unsur maksimum ing stream. Ayo coba mangerteni carane bisa digunakake kanthi conto:
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);
Kesimpulan:
Unsur paling cilik: 1 Unsur paling gedhe: 98
Panjelasan: Ing conto iki, kita nyithak unsur paling cilik ing numStream nggunakake metode min () lan unsur paling gedhe nggunakake metode max () . Elinga yen ing kene, sadurunge nggunakake metode max () , kita wis nambahake unsur menyang numStream maneh . Iki amarga min () operasi terminal lan numpes isi stream asli, bali mung asil final (kang ing kasus iki ana integer "paling cilik").

findAny() lan findFirst()

findAny () ngasilake sembarang unsur stream minangka Opsional . Yen stream kosong, uga bakal ngasilake nilai Opsional , sing bakal kosong. findFirst () ngasilake unsur pisanan stream minangka Opsional . Kaya metode findAny () , metode findFirst () uga ngasilake parameter Opsional kosong yen aliran sing cocog kosong. Ayo goleki conto ing ngisor iki adhedhasar metode kasebut:
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);
Kesimpulan:
Opsional[43] Opsional.kosong
Panjelasan: Ing kasus sing sepisanan, metode findFirst () ngasilake unsur pertama aliran kasebut minangka Opsional . Banjur, nalika Utas ditugasake maneh minangka Utas kosong, cara findAny () ngasilake opsional kosong .

allMatch() , anyMatch() lan noneMatch()

Cara allMatch () digunakake kanggo mriksa apa kabeh unsur ing stream cocog predikat tartamtu lan ngasilake nilai boolean bener yen padha nindakake, digunakake bali false . Yen stream kosong, bali bener . Metode anyMatch () digunakake kanggo mriksa manawa ana unsur ing aliran sing cocog karo predikat tartamtu. Ngasilake bener yen mangkono, palsu yen ora. Yen stream kosong, bali palsu . Cara noneMatch () ngasilake bener yen ora ana unsur ing stream sing cocog karo predikat, lan palsu . Conto kanggo nggambarake iki katon kaya iki:
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);
Kesimpulan:
palsu bener palsu
Panjelasan: Kanggo stream numStream ngemot 1 minangka unsur, cara allMatch () ngasilake palsu amarga kabeh unsur ora 1, nanging mung siji. Metode anyMatch () ngasilake bener amarga paling ora siji unsur yaiku 1. Cara noneMatch () ngasilake palsu amarga 1 bener ana minangka unsur ing aliran iki.

Evaluasi Lazy ing Java Stream

Evaluasi males ndadékaké optimasi nalika nggarap Java Streams ing Jawa 8. Iku utamané ndherek tundha operasi penengah nganti operasi terminal ditemoni. Evaluasi kesed tanggung jawab kanggo nyegah sampah sumber daya sing ora perlu ing petungan nganti asil kasebut pancen dibutuhake. Output stream asil saka operasi penengah kui mung sawise operasi terminal wis rampung. Evaluasi kesed bisa digunakake karo kabeh operasi penengah ing aliran Jawa. Panggunaan evaluasi kesed banget nalika nggarap aliran tanpa wates. Kanthi cara iki, akeh pangolahan sing ora perlu dicegah.

Pipeline ing Java Stream

Pipa ing Java Stream kasusun saka aliran input, nol utawa luwih operasi penengah sing diantrekake siji-sijine, lan pungkasane operasi terminal. Operasi penengah ing Java Streams ditindakake kanthi kesed. Iki ndadekake operasi penengah pipelined ora bisa dihindari. Kanthi pipelines, kang Sejatine operasi penengah digabungake supaya, execution kesed dadi bisa. Pipeline mbantu nglacak operasi penengah sing kudu ditindakake sawise operasi terminal pungkasane ditemokake.

Kesimpulan

Ayo saiki ngringkes apa sing wis kita sinau dina iki. Ing artikel iki:
  1. We njupuk dipikir cepet apa Java Streams.
  2. Kita banjur sinau macem-macem teknik kanggo nggawe utas Jawa ing Jawa 8.
  3. Kita sinau rong jinis operasi utama (operasi penengah lan operasi terminal) sing bisa ditindakake ing aliran Jawa.
  4. Kita banjur ndeleng kanthi rinci ing sawetara conto operasi penengah lan terminal.
  5. Kita pungkasane sinau luwih akeh babagan evaluasi kesed lan pungkasane sinau babagan pipelining ing benang Jawa.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION