JavaRush /Blog Jawa /Random-JV /Terjemahan buku. Pemrograman Fungsional ing Jawa. Bab 1
timurnav
tingkat

Terjemahan buku. Pemrograman Fungsional ing Jawa. Bab 1

Diterbitake ing grup
Aku bakal seneng mbantu sampeyan nemokake kesalahan lan nambah kualitas terjemahan. Aku nerjemahake kanggo nambah katrampilan basa Inggris, lan yen sampeyan maca lan nggoleki kesalahan terjemahan, sampeyan bakal luwih apik tinimbang aku. Penulis buku kasebut nulis manawa buku kasebut nganggep akeh pengalaman nggarap basa Jawa, jujur, aku dhewe ora duwe pengalaman khusus, nanging aku ngerti materi ing buku kasebut. Buku kasebut nyritakake sawetara teori sing angel diterangake nganggo driji. Yen ana artikel sing apik ing wiki, aku bakal menehi tautan menyang dheweke, nanging kanggo pemahaman sing luwih apik, aku nyaranake sampeyan Google dhewe. apik luck kanggo kabeh. :) Kanggo wong-wong sing pengin mbenerake terjemahanku, uga kanggo wong-wong sing ora bisa maca ing basa Rusia, sampeyan bisa ngundhuh buku asli ing kene . Isi Bab 1 Halo, Ekspresi Lambda - saiki maca Bab 2 Nggunakake Koleksi - ing pangembangan Bab 3 Strings, Comparator lan Filter - ing pembangunan Bab 4 Pangembangan karo Ekspresi Lambda - ing pembangunan Bab 5 Nggarap Sumber Daya - ing pembangunan Bab 6 Dadi Lazy - ing pembangunan Bab 7 Ngoptimalake sumber daya - ing pembangunan Bab 8 Tata letak karo ekspresi lambda - ing pembangunan Bab 9 Nggabungake kabeh - ing pembangunan

Bab 1 Halo, Ekspresi Lambda!

Kode Java kita siap kanggo transformasi sing luar biasa. Tugas saben dina sing ditindakake dadi luwih gampang, luwih gampang lan luwih ekspresif. Cara anyar pemrograman Jawa wis digunakake pirang-pirang dekade ing basa liya. Kanthi owah-owahan ing Jawa, kita bisa nulis kode sing ringkes, elegan, lan ekspresif kanthi luwih sithik kesalahan. Kita bisa nggunakake iki kanggo gampang ngetrapake standar lan ngleksanakake pola desain umum kanthi baris kode sing luwih sithik. Ing buku iki, kita njelajah gaya fungsional pemrograman nggunakake conto langsung masalah sing kita lakoni saben dina. Sadurunge kita nyilem menyang gaya elegan lan cara anyar iki ngembangaken piranti lunak, ayo kang ndeleng apa iku luwih apik.
Ganti pikiran sampeyan
Gaya imperatif yaiku apa sing wis diwenehake Jawa wiwit wiwitane basa. Gaya iki nyaranake supaya kita njlèntrèhaké ing Jawa saben langkah apa sing dikarepake basa kasebut, banjur kita mung mesthekake yen langkah-langkah kasebut ditindakake kanthi bener. Iki kerjane apik, nanging isih tingkat kurang. Kode rampung banget verbose, lan kita asring wanted basa sing sethitik liyane cerdas. Kita banjur bisa ngomong kanthi deklaratif - apa sing dikarepake, lan ora ngerti carane nindakake. Thanks kanggo pangembang, Jawa saiki bisa nulungi kita. Ayo goleki sawetara conto kanggo mangerteni keuntungan lan beda antarane pendekatan kasebut.
Cara biasanipun
Ayo dadi miwiti karo dhasar akrab kanggo ndeleng loro paradigma ing tumindak. Iki nggunakake cara sing penting kanggo nggoleki Chicago ing koleksi kutha - dhaptar ing buku iki mung nuduhake potongan kode. boolean found = false; for(String city : cities) { if(city.equals("Chicago")) { found = true; break; } } System.out.println("Found chicago?:" + found); Versi imperatif kode kasebut rame (apa hubungane tembung iki?) Lan tingkat rendah, ana sawetara bagean sing bisa diowahi. Kaping pisanan, kita nggawe gendera boolean sing mambu iki sing diarani ketemu lan banjur ngulang saben unsur ing koleksi kasebut. Yen kita nemokake kutha sing kita goleki, kita nyetel gendéra dadi bener lan ngilangi gelung. Pungkasan, kita nyithak asil panelusuran menyang konsol.
Ana cara sing luwih apik
Minangka programer Jawa teliti, Mirit wayahe ing kode iki bisa nguripake menyang soko liyane ekspresif lan luwih gampang diwaca, kaya iki: System.out.println("Found chicago?:" + cities.contains("Chicago")); Punika conto gaya declarative - ngandhut () cara mbantu kita langsung menyang apa kita kudu.
owah-owahan nyata
Owah-owahan iki bakal nggawa jumlah dandan sing cukup kanggo kode kita:
  • Ora fuss karo variabel mutable
  • Loop iterasi didhelikake ing ngisor hood
  • Kurang kode keruwetan
  • kode kajelasan Greater, fokus manungsa waé
  • Kurang impedansi; kode rapet trails maksud bisnis
  • Kurang kasempatan kesalahan
  • Luwih gampang dingerteni lan ndhukung
Ngluwihi kasus prasaja
Iki minangka conto prasaja saka fungsi deklaratif sing mriksa anane unsur ing koleksi; wis suwe digunakake ing Jawa. Saiki bayangake ora kudu nulis kode imperatif kanggo operasi sing luwih maju kaya parsing file, nggarap database, nggawe panjalukan kanggo layanan web, nggawe multithreading, lsp. Jawa saiki ndadekake bisa nulis kode sing ringkes lan elegan sing ndadekake luwih angel nggawe kesalahan, ora mung ing operasi sing prasaja, nanging ing kabeh aplikasi kita.
Cara lawas
Ayo goleki conto liyane. Kita nggawe koleksi kanthi rega lan bakal nyoba sawetara cara kanggo ngetung jumlah kabeh rega diskon. Upamane kita dijaluk nyimpulake kabeh rega sing regane ngluwihi $20, kanthi diskon 10%. Sumangga katindakaken kanthi cara Jawi ingkang limrahipun. Kode iki kudu banget menowo kanggo kita: pisanan kita nggawe totalOfDiscountedPrices variabel mutable menyang kang kita bakal nyimpen nilai asil. Banjur kita daur ulang koleksi rega, pilih rega sing luwih saka $ 20, entuk rega diskon, lan tambahake nilai kasebut menyang totalOfDiscountedPrices . Ing pungkasan kita nampilake jumlah kabeh prices njupuk menyang akun diskon. Ing ngisor iki apa output kanggo console final List prices = Arrays.asList( new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"), new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"), new BigDecimal("45"), new BigDecimal("12")); BigDecimal totalOfDiscountedPrices = BigDecimal.ZERO; for(BigDecimal price : prices) { if(price.compareTo(BigDecimal.valueOf(20)) > 0) totalOfDiscountedPrices = totalOfDiscountedPrices.add(price.multiply(BigDecimal.valueOf(0.9))); } System.out.println("Total of discounted prices: " + totalOfDiscountedPrices);
Total diskon prices: 67,5
Kerjane, nanging kode katon tumoto. Nanging ora salah kita, kita nggunakake apa sing kasedhiya. Kode kasebut cukup sithik - nandhang obsesi karo primitif (google, barang sing menarik) lan mabur ngadhepi prinsip tanggung jawab tunggal . Kita sing kerja ing omah kudu njaga kode kasebut adoh saka mripate bocah-bocah sing kepengin dadi programer, bisa uga ngganggu pikirane sing rapuh, disiapake kanggo pitakonan "Apa iki sing kudu dilakoni kanggo urip?"
Ana cara sing luwih apik, liyane
Saiki kita bisa luwih apik, luwih apik. Kode kita bisa uga meh padha karo syarat spesifikasi. Iki bakal mbantu kita nyuda kesenjangan antarane kabutuhan bisnis lan kode sing ngleksanakake, luwih nyuda kemungkinan syarat sing disalahake. Tinimbang nggawe variabel banjur ganti bola-bali, ayo kerja ing tingkat abstraksi sing luwih dhuwur, kayata ing dhaptar ing ngisor iki. final BigDecimal totalOfDiscountedPrices = prices.stream() .filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0) .map(price -> price.multiply(BigDecimal.valueOf(0.9))) .reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println("Total of discounted prices: " + totalOfDiscountedPrices); Ayo maca kanthi banter - filter rega luwih saka 20, peta (gawe pasangan "kunci" "nilai") nggunakake tombol "rega", rega kalebu diskon, banjur tambahake.
- komentar penerjemah tegese tembung sing katon ing sirah nalika maca kode .filter(rega -> price.compareTo(BigDecimal.valueOf(20)) > 0)
Kode kasebut dieksekusi bebarengan ing urutan logis sing padha karo sing wis diwaca. Kode iki shortened, nanging kita digunakake Bunch wutuh saka iku anyar saka Jawa 8. First, kita disebut stream () cara ing dhaftar prices . Iki mbukak lawang menyang iterator khusus kanthi macem-macem fitur penak sing bakal dibahas mengko. Tinimbang langsung loop liwat kabeh nilai ing dhaftar prices , kita nggunakake sawetara cara khusus kayata Filter () lan map () . Ora kaya metode sing digunakake ing Jawa lan JDK, metode iki njupuk fungsi anonim - ekspresi lambda - minangka parameter ing kurung. Kita bakal sinau luwih rinci mengko. Kanthi nelpon metode nyuda () , kita ngetung jumlah nilai (rega diskon) sing dipikolehi ing metode peta () . Daur ulang didhelikake kanthi cara sing padha nalika nggunakake metode ngandhut () . Filter () lan peta () cara Nanging malah luwih Komplek. Kanggo saben rega ing dhaftar prices , padha nelpon fungsi lambda liwati lan nyimpen menyang koleksi anyar. Cara nyuda () diarani koleksi iki kanggo ngasilake asil pungkasan. Ing ngisor iki apa output kanggo console
Total diskon prices: 67,5
Malih
Ing ngisor iki owah-owahan relatif marang cara biasanipun:
  • Kode iku nyenengake kanggo mripat lan ora cluttered.
  • Ora ana operasi tingkat rendah
  • Luwih gampang kanggo nambah utawa ngganti logika
  • Iterasi dikontrol dening perpustakaan metode
  • Efisiensi, evaluasi loop malas
  • Luwih gampang paralel yen perlu
Kita bakal ngrembug mengko carane Jawa nyedhiyakake dandan kasebut.
Lambda kanggo ngluwari :)
Lambda minangka kunci fungsional kanggo mbebasake kita saka kerumitan pemrograman sing penting. Kanthi ngganti cara kita program, kanthi fitur paling anyar saka Jawa, kita bisa nulis kode sing ora mung elegan lan ringkes, nanging uga kurang rawan kesalahan, luwih efisien, lan luwih gampang kanggo ngoptimalake, nambah, lan nggawe multi-threaded.
Win Big saka Pemrograman Fungsional
Gaya pemrograman fungsional nduweni rasio signal-to-noise sing luwih dhuwur ; Kita nulis baris kode luwih sithik, nanging saben baris utawa ekspresi nduweni fungsi luwih akeh. Kita entuk sethithik saka versi fungsional kode dibandhingake karo prentah:
  • Kita nyingkiri owah-owahan sing ora dikarepake utawa reassignment variabel, sing dadi sumber kesalahan lan nggawe angel ngolah kode saka benang sing beda-beda ing wektu sing padha. Ing versi imperatif, kita nyetel nilai sing beda kanggo variabel totalOfDiscountedPrices sajrone daur ulang . Ing versi fungsional, ora ana owah-owahan eksplisit ing variabel ing kode kasebut. Owah-owahan sing luwih sithik nyebabake kurang bug ing kode kasebut.
  • Versi fungsional kode luwih gampang kanggo paralel. Sanajan petungan ing peta () cara dawa, kita bisa mbukak ing podo karo tanpa wedi apa. Yen kita ngakses kode gaya imperatif saka macem-macem utas, kita kudu kuwatir babagan ngganti variabel totalOfDiscountedPrices bebarengan . Ing versi fungsional, kita ngakses variabel mung sawise kabeh owah-owahan wis digawe, iki mbebasake kita saka kuwatir bab safety thread kode.
  • Kode kasebut luwih ekspresif. Tinimbang nglakokake kode ing sawetara langkah - nggawe lan miwiti variabel kanthi nilai goblok, ngubengi dhaptar rega, nambah rega diskon menyang variabel, lan liya-liyane - kita mung takon cara peta () dhaptar kanggo ngasilake dhaptar liyane. saka prices diskon lan nambah munggah .
  • Gaya fungsional luwih ringkes: luwih sithik baris kode sing dibutuhake tinimbang versi imperatif. Kode luwih kompak tegese kurang nulis, kurang diwaca, lan luwih gampang dijaga.
  • Versi fungsional kode kasebut intuisi lan gampang dingerteni, yen sampeyan ngerti sintaks kasebut. peta () cara ditrapake fungsi liwati (sing ngetung rega diskon) kanggo saben unsur koleksi lan mrodhuksi koleksi karo asil, kita bisa ndeleng ing gambar ngisor iki.

Gambar Figure 1 - cara peta ditrapake fungsi liwati kanggo saben unsur koleksi
Kanthi dhukungan saka ekspresi lambda, kita bisa nggunakake kekuwatan gaya fungsional pemrograman ing Jawa. Yen kita nguwasani gaya iki, kita bisa nggawe kode sing luwih ekspresif, luwih ringkes kanthi owah-owahan lan kesalahan sing luwih sithik. Sadurunge, salah sawijining kaluwihan utama Jawa yaiku dhukungan kanggo paradigma berorientasi obyek. Lan gaya fungsional ora mbantah OOP. Kaunggulan nyata ing pamindhahan saka program imperatif menyang program deklaratif. Kanthi Java 8, kita bisa nggabungake pemrograman fungsional kanthi gaya berorientasi obyek kanthi efektif. Kita bisa terus aplikasi gaya OO kanggo obyek, orane katrangan, negara lan sesambetan. Kajaba iku, kita bisa nggawe model prilaku lan kahanan owah-owahan, proses bisnis lan pangolahan data minangka seri set fungsi.
Napa kode ing gaya fungsional?
Kita wis ndeleng keuntungan sakabèhé saka gaya fungsional program, nanging gaya anyar iki worth sinau? Apa iki bakal dadi owah-owahan cilik ing basa utawa bakal ngganti urip kita? Kita kudu njaluk jawaban kanggo pitakonan kasebut sadurunge mbuwang wektu lan tenaga. Nulis kode basa Jawa ora angel, sintaks basane prasaja. Kita kepenak karo perpustakaan lan API sing akrab. Apa tenan mbutuhake kita sijine ing gaweyan kanggo nulis lan njaga kode iku aplikasi Enterprise khas ngendi kita nggunakake Jawa kanggo pembangunan. Kita kudu mesthekake yen kanca-kanca programer nutup sambungan menyang database ing wektu sing bener, supaya ora nyekel utawa nindakake transaksi luwih suwe tinimbang sing dibutuhake, supaya bisa nyekel pangecualian kanthi lengkap lan ing tingkat sing bener, supaya bisa ngetrapake lan ngeculake kunci kanthi bener. ... lembaran iki bisa diterusake nganti suwe banget. Saben argumen ing ndhuwur mung ora duwe bobot, nanging bebarengan, yen digabungake karo kerumitan implementasine sing ana, dadi akeh banget, akeh wektu lan angel ditindakake. Apa yen kita bisa mbungkus kerumitan kasebut dadi potongan-potongan kode cilik sing uga bisa ngatur kanthi apik? Banjur kita ora bakal terus-terusan mbuwang energi kanggo ngetrapake standar. Iki bakal menehi kauntungan sing serius, mula ayo goleki kepiye gaya fungsional bisa mbantu.
Joe takon
Apa kode cekak * tegese luwih sithik huruf kode?
* kita ngomong babagan tembung ringkes , sing menehi ciri gaya fungsional kode nggunakake ekspresi lambda
Ing konteks iki, kode kasebut kudu ringkes, tanpa embel-embel, lan dikurangi dadi pengaruh langsung supaya bisa menehi maksud kanthi luwih efektif. Iki minangka keuntungan sing adoh banget. Nulis kode kaya nggabungake bahan-bahan: nggawe ringkes kaya nambah saus. Kadhangkala butuh luwih akeh gaweyan kanggo nulis kode kasebut. Kode kurang diwaca, nanging nggawe kode luwih transparan. Penting supaya kode kasebut cetha nalika nyepetake. Kode ringkes padha karo trik desain. Kode iki mbutuhake tarian kurang karo rebana. Iki tegese kita bisa kanthi cepet ngleksanakake gagasan lan nerusake yen bisa digunakake lan ninggalake yen ora cocog karo pangarepan.
Pengulangan ing steroid
Kita nggunakake iterator kanggo ngolah dhaptar obyek, uga kanggo nggarap Set lan Peta. Iterator sing digunakake ing basa Jawa wis akrab karo kita, sanajan isih primitif, nanging ora prasaja. Ora mung padha njupuk sawetara baris kode, padha uga cukup angel kanggo nulis. Kepiye cara ngulang kabeh unsur koleksi? Kita bisa nggunakake loop for. Kepiye carane milih sawetara unsur saka koleksi kasebut? Nggunakake padha kanggo daur ulang, nanging nggunakake sawetara variabel mutable tambahan sing kudu dibandhingake karo soko saka koleksi. Banjur, sawise milih nilai tartamtu, kepiye cara nindakake operasi ing nilai siji, kayata minimal, maksimum, utawa sawetara nilai rata-rata? Maneh siklus, maneh variabel anyar. Iki kaya paribasan, sampeyan ora bisa ndeleng wit amarga alas (asli nggunakake dolanan tembung sing ana hubungane karo iterasi lan tegese "Kabeh dijupuk, nanging ora kabeh kasil" - cathetan penerjemah). jdk saiki nyedhiyakake iterator internal kanggo macem-macem statement: siji kanggo nyederhanakake looping, siji kanggo ngiket dependensi asil sing dibutuhake, siji kanggo nyaring nilai output, siji kanggo bali nilai, lan sawetara fungsi penak kanggo njupuk min, max, rata-rata, etc. Kajaba iku, fungsi operasi kasebut bisa digabungake kanthi gampang, supaya kita bisa nggabungake macem-macem set kasebut kanggo ngetrapake logika bisnis kanthi luwih gampang lan kode kurang. Yen wis rampung, kode bakal luwih gampang dingerteni amarga nggawe solusi logis ing urutan sing dibutuhake masalah kasebut. Kita bakal nliti sawetara conto kode kasebut ing Bab 2 lan mengko ing buku iki.
Aplikasi saka algoritma
Algoritma drive aplikasi perusahaan. Contone, kita kudu nyedhiyani operasi sing mbutuhake wewenang mriksa. Kita kudu nggawe manawa transaksi rampung kanthi cepet lan mriksa wis rampung kanthi bener. Tugas kasebut asring dikurangi dadi cara sing biasa banget, kaya ing dhaptar ing ngisor iki: Transaction transaction = getFromTransactionFactory(); //... Операция выполняющаяся во время транзакции... checkProgressAndCommitOrRollbackTransaction(); UpdateAuditTrail(); Ana rong masalah karo pendekatan iki. Kaping pisanan, iki asring ndadékaké tikel kaping pindho saka gaweyan pangembangan, sing uga ndadékaké kenaikan biaya kanggo njaga aplikasi kasebut. Kapindho, iku gampang banget kanggo kantun pangecualian sing bisa di buwang ing kode saka aplikasi iki, mangkono jeopardizing eksekusi transaksi lan wacana mriksa. Kita bisa nggunakake pamblokiran nyoba-pungkasan, nanging saben-saben ana wong nutul kode iki, kita kudu mriksa maneh yen logika kode kasebut durung rusak. Yen ora, kita bisa ninggalake pabrik lan nguripake kabeh kode ing sirahe. Tinimbang nampa transaksi, kita bisa ngirim kode pangolahan menyang fungsi sing dikelola kanthi apik, kayata kode ing ngisor iki. runWithinTransaction((Transaction transaction) -> { //... Операция выполняющаяся во время транзакции... }); Owah-owahan cilik iki nambahi tabungan gedhe. Algoritma kanggo mriksa status lan mriksa aplikasi diwenehi tingkat anyar abstraksi lan encapsulated nggunakake cara runWithinTransaction () . Ing cara iki kita nyeleh Piece saka kode sing kudu kaleksanan ing konteks transaksi. Kita ora kudu kuwatir maneh yen lali nindakake apa-apa utawa apa kita entuk pangecualian ing papan sing bener. Fungsi algoritma ngurusi iki. Masalah iki bakal dibahas luwih rinci ing Bab 5.
Ekstensi Algoritma
Algoritma luwih kerep digunakake, nanging supaya bisa digunakake kanthi lengkap ing pangembangan aplikasi perusahaan, perlu cara kanggo ngluwihi.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION