


Java Stream mengimplementasikan kumpulan dan pemetaan data rentetan kompleks
Oct 15, 2025 am 10:51 AM1. Latar belakang dan analisis keperluan
Dalam pemprosesan data, kita sering menghadapi keperluan untuk menukar data rentetan mentah dalam format tertentu ke dalam jenis koleksi yang lebih mudah untuk dikendalikan. Sebagai contoh, diberi rentetan yang mengandungi pelbagai maklumat bandar, dipisahkan oleh koma, setiap maklumat bandar mengandungi kod kawasan dan nama bandar, dipisahkan dengan $$:
Data string = "010 $$ fengtai, 010 $$ chaoyang, 010 $$ haidain, 027 $$ wuchang, 027 $$ Hongshan, 027 $$ caidan, 021 $$ changnin, 021 $$ xUHUI, 020 $$ TIANHE";
Matlamat kami adalah untuk mengubahnya menjadi peta
{ 027 = [Wuchang, Hongshan, Caidan], 020 = [Tianhe], 010 = [Fengtai, Chaoyang, Haidain], 021 = [Changnin, Xuhui] }
2. Pelaksanaan dan batasan kaedah lelaran tradisional
Sebelum Java 8, atau apabila kita tidak biasa dengan API Stream, kita biasanya menggunakan lelaran gelung tradisional untuk menyelesaikan penukaran tersebut. Berikut adalah contoh pendekatan ini:
import java.util.arraylist; import java.util.arrays; import java.util.hashmap; import java.util.list; import java.util.map; kelas awam tradisionalparser { Peta awam <string senarai>> parsedAtatRaditional (string inputData) { // Langkah satu: berasingan dengan koma, dan selanjutnya terpisah dengan senarai $$ <string> splitDatalist = arrays.stream (inputData.split (",")) .map (s -> s.split ("\\ $ \\ $")) .kolect (collectors.tolist ()); // Stream masih digunakan di sini, tetapi susulan adalah lelaran tradisional // Langkah 2: Pemprosesan Iteratif dan Pembinaan Peta Peta <string senarai>> resultMap = hashmap baru (); untuk (string [] entri: splitdatalist) { String kekunci = entri [0]; Nilai string = entri [1]; // Periksa sama ada senarai yang sepadan dengan kunci sudah ada dalam senarai peta <string> list = resultMap.get (kekunci); jika (senarai == null) { // Jika ia tidak wujud, buat senarai baru dan tambahkan senarai elemen = arrayList baru (); list.add (nilai); resultMap.put (kunci, senarai); } else { // Jika ia wujud, tambahkan elemen terus ke senarai senarai yang sedia ada (nilai); } } hasil pulangan; } }</string></string></string></string>
Walaupun kaedah ini dapat mencapai fungsi, ia mempunyai batasan berikut:
- Kod ini verbose : hashmap dan arraylist perlu dibuat secara eksplisit dan mengandungi banyak logik jika else untuk mengendalikan penciptaan senarai dan penambahan elemen.
- Kebolehbacaan yang lemah : Logik perniagaan bertaburan di pelbagai baris kod, menjadikannya sukar untuk melihat niat terasnya -kumpulan dan pemetaan -pada pandangannya.
- Pengaturcaraan Imperatif : memberi tumpuan kepada "bagaimana" dan bukannya "apa", mengurangkan sifat deklaratif kod.
3. Gunakan API Stream Java untuk mencapai penukaran yang cekap
API Stream yang diperkenalkan di Java 8 menyediakan cara yang lebih bersih dan lebih deklaratif untuk bekerja dengan data pengumpulan. Untuk keperluan pengelompokan dan pemetaan dalam contoh ini, pengumpul.groupingby dan pengumpul.Mapping adalah kombinasi yang ideal.
3.1 pengumpul.groupingby dan pengumpul.Mapping
Pengumpul.groupingby (fungsi Super t ,? extends k> pengelas) : Ini adalah pengumpul yang sangat kuat yang digunakan untuk kumpulan kumpulan dalam aliran berdasarkan fungsi pengelas yang disediakan (pengelas). Ia menukarkan unsur -unsur dalam aliran ke dalam peta
>, di mana k adalah kunci yang dikembalikan oleh fungsi pengelas dan senarai adalah senarai semua elemen asal yang dimiliki oleh kunci itu. COLLECTORS.GroupingBy (Fungsi Super t ,? Extends k> pengelas, pengumpul Super t, a, d> hiliran) : Ini adalah versi kumpulan yang dibebankan yang membolehkan kita menentukan "pemungut hiliran" (hiliran). Pemungut hiliran ini akan digunakan untuk unsur -unsur di dalam setiap kumpulan, dengan itu mengubah jenis nilai peta. Sebagai contoh, jika anda mahu nilai peta tidak disenaraikan
tetapi tetapkan , atau jika kita perlu memetakannya lagi untuk menyenaraikan , anda boleh menggunakan pemungut hiliran. Pengumpul.mapping (fungsi Super t ,? extends u> mapper, collector Super u, a, r> hiliran) : pengumpul pemetaan itu sendiri bukan operasi terminal. Ia biasanya digunakan sebagai parameter pemungut lain (seperti pemungut hiliran kumpulan). Fungsinya adalah untuk menukar setiap elemen terlebih dahulu dalam aliran melalui fungsi Mapper, dan kemudian lulus hasil yang ditukar kepada pemungut hilirannya sendiri.
3.2 Percubaan dan Pengoptimuman Awal
Mari semak percubaan aliran asal kami:
// peta percubaan awal <string senarai>> result = arrays.stream (data.split (",")) .Collect (collectors.groupingby (s -> s.split ("\\ $ \\ $") [0]));</string>
Masalah dengan percubaan ini adalah bahawa ia hanya menyelesaikan pengelompokan, tetapi jenis nilai peta akan disenaraikan
import java.util.arrays; import java.util.list; import java.util.map; import java.util.stream.collectors; Kelas Awam StreamParser { peta awam <string senarai>> parsedataStream (string inputData) { return arrays.stream (inputData.split (",")) // 1. Pisahkan rentetan asal dengan koma untuk mendapatkan aliran <string> .Kollect (collectors.groupingby ( s -> s.split ("\\ $ \\ $") [0], // 2. Tentukan kunci kumpulan: Gunakan awalan "$$" sebagai kunci Pengumpul.mapping ( s -> s.split ("\\ $ \\ $") [1], // 3. Tentukan pemetaan nilai: gunakan akhiran "$$" sebagai nilai Pengumpul.tolist () // 4. Tentukan pengumpul hiliran: kumpulkan nilai dipetakan ke dalam senarai) )); } }</string></string>
Penyelesaian ini sangat dekat dengan matlamat dan melaksanakan operasi aliran "satu ayat". Walau bagaimanapun, pandangan yang lebih dekat mendedahkan bahawa operasi S.Split ("\\ $ \\ $") dipanggil dua kali dalam kedua -dua fungsi pengelas kumpulan dan fungsi pemetaan pemetaan. Bagi setiap elemen, rentetan dibahagikan dua kali, yang mungkin menanggung sedikit prestasi.
Untuk pengoptimuman selanjutnya, kita boleh terlebih dahulu melakukan pra -proses untuk menukar setiap elemen rentetan asal (seperti "010 $$ fengtai") ke dalam array rentetan (seperti {"010", "fengtai"}), dan kemudian melakukan kumpulan dan pemetaan. Dengan cara ini, operasi perpecahan hanya dilakukan sekali:
import java.util.arrays; import java.util.list; import java.util.map; import java.util.stream.collectors; kelas awam OptimisedStreampParser { peta awam> parsedataoptimizedstream (string inputData) { return arrays.stream (inputData.split (",")) // 1. Pisahkan rentetan asal dengan koma untuk mendapatkan aliran .map (s -> s.split ("\\ $ \\ $")) // 2 preprocessing: Split setiap elemen rentetan ke dalam rentetan [] array.collect (collector.groupingby ( Sarray -> Sarray [0], // 3. Tentukan kunci pengelompokan: Gunakan elemen pertama array sebagai kunci Pengumpul.mapping ( Sarray -> Sarray [1], // 4. Tentukan Nilai Pemetaan: Gunakan elemen kedua array sebagai nilai Pengumpul.tolist () // 5. Tentukan pengumpul hiliran: mengumpul nilai dipetakan ke dalam senarai) )); } public static void main (string [] args) { Data string = "010 $$ fengtai, 010 $$ chaoyang, 010 $$ haidain, 027 $$ wuchang, 027 $$ Hongshan, 027 $$ caidan, 021 $$ changnin, 021 $$ xUHUI, 020 $$ TIANHE"; Parser OptimisedStreampParser = baru OptimizedStreampParser (); Peta > result = parser.parsedataoptimizedStream (data); System.out.println (hasil); // output yang dijangkakan: {027 = [Wuchang, Hongshan, Caidan], 020 = [Tianhe], 021 = [Changnin, Xuhui], 010 = [Fengtai, Chaoyang, Haidain]} } }
Paip aliran yang dioptimumkan ini bukan sahaja ringkas, tetapi juga lebih cekap kerana ia mengelakkan operasi pemisahan rentetan berulang.
4. Langkah berjaga -jaga
- Kekukuhan Format Data : Paip aliran di atas mengandaikan bahawa data input dengan ketat mengikuti format nilai $$ utama, nilai $$ kunci. Sekiranya situasi berikut mungkin berlaku dalam data, pemprosesan tambahan diperlukan:
- Hilang $$ pemisah: s.split ("\\ $ \\ $") [0] atau s.split ("\\ $ \\ $") [1] boleh membuang arrayindexoutofboundsexception.
- Rentetan kosong atau hanya $$: boleh menyebabkan kekunci atau nilai kosong, atau array keluar dari batas.
- Multiple $$: Kaedah perpecahan akan berpecah dengan $$ pertama, tetapi jika tingkah laku yang diharapkan adalah berbeza, ungkapan biasa perlu diselaraskan.
- Unsur -unsur kosong: Sebagai contoh, "010 $$ fengtai ,, 027 $$ wuchang", data.split (",") akan menghasilkan rentetan kosong. Untuk meningkatkan keteguhan, anda boleh menambah penapis atau cuba logik penangkap ke operasi peta, atau melakukan pemeriksaan panjang selepas berpecah. Contohnya:
.map (s -> s.split ("\\ $ \\ $")) .filter (arr -> arr.length == 2) // menapis elemen dengan format yang salah // ... logik kumpulan berikutnya
- Pertimbangan Prestasi : Untuk set data yang sangat besar, operasi terikat API Stream boleh memperkenalkan overhead tertentu. Tetapi dalam senario aplikasi yang paling biasa, kelebihan kesederhanaan kod dan kebolehbacaan jauh melebihi perbezaan prestasi kecil ini. Sekiranya prestasi menjadi kesesakan, penandaarasan harus dilakukan dan pengoptimuman berulang peringkat rendah dapat dipertimbangkan.
- Kebolehbacaan dan kerumitan : Walaupun API Stream menggalakkan operasi "satu ayat", saluran paip aliran yang terlalu kompleks dapat mengurangkan kebolehbacaan kod. Apabila logik menjadi sangat kompleks, pertimbangkan untuk memisahkan operasi aliran ke dalam pelbagai kaedah penolong, atau dalam beberapa kes, gelung tradisional mungkin lebih mudah difahami dan diselenggarakan.
5. Ringkasan
Melalui tutorial ini, kami belajar bagaimana menggunakan API Java Stream, terutamanya gabungan pengumpul.groupingby dan pengumpul.mapping, untuk dengan cekap dan elegan menukar data rentetan dalam format tertentu ke dalam peta
Atas ialah kandungan terperinci Java Stream mengimplementasikan kumpulan dan pemetaan data rentetan kompleks. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Gunakan parameter -CP untuk menambah balang ke ClassPath, supaya JVM dapat memuatkan kelas dan sumber dalamannya, seperti Java -Cplibrary.Jarcom.Example.Main, yang menyokong pelbagai balang yang dipisahkan oleh titik -titik komisul atau kolon, dan juga boleh dikonfigurasikan melalui pembolehubah persekitaran kelas atau manifest.mf.

UseFile.createenewfile () tocreateafileonlyifitdoesneteTexist, mengelakkan penulisan; 2.preferfiles.createFile () darinio.2formodern, safeFileCreationThatFailSiffileexists;

Javaspi adalah mekanisme penemuan perkhidmatan terbina dalam JDK, dan melaksanakan pengembangan dinamik berorientasikan antara muka melalui ServicEloader. 1. Tentukan antara muka perkhidmatan dan buat fail yang dinamakan dengan nama penuh antara muka di bawah Meta-INF/Services/, dan tulis nama yang berkelayakan sepenuhnya kelas pelaksanaan; 2. Gunakan serviceLoader.load () untuk memuatkan kelas pelaksanaan, dan JVM secara automatik akan membaca konfigurasi dan instantiate; 3. Kontrak antara muka harus dijelaskan semasa reka bentuk, keutamaan sokongan dan pemuatan bersyarat, dan menyediakan pelaksanaan lalai; 4. Senario aplikasi termasuk akses saluran pelbagai pembayaran dan pengesahan pemalam; 5. Perhatikan prestasi, classpath, pengasingan pengecualian, keselamatan benang dan keserasian versi; 6. Dalam Java9, menyediakan boleh digunakan dalam kombinasi dengan sistem modul.

JavagenericsprovideCompile-timetypesafetyandeliminatecastingingbyallowingtypeparametersonclass, antara muka, andmethods; wildcards (?,? Extendstype ,? supertype) handleunknowntypeswithflexxibility.usoSoRdoRderWildwildwhoRderWildwildwildwildwilddwherwherwilderwilderwilderwilderwildloundwilder .1

Gunakan kata kunci untuk melaksanakan antara muka. Kelas perlu menyediakan pelaksanaan khusus semua kaedah dalam antara muka. Ia menyokong pelbagai antara muka dan dipisahkan oleh koma untuk memastikan kaedahnya adalah umum. Kaedah lalai dan statik selepas Java 8 tidak perlu ditulis semula.

Artikel ini meneroka mekanisme menghantar banyak permintaan HTTP pada soket TCP yang sama, iaitu, sambungan berterusan HTTP (Keep-Alive). Artikel ini menjelaskan perbezaan antara protokol HTTP/1.X dan HTTP/2, menekankan pentingnya sokongan pelayan untuk sambungan yang berterusan, dan bagaimana untuk mengendalikan sambungan dengan betul: Tepung Response Headers. Dengan menganalisis kesilapan biasa dan menyediakan amalan terbaik, kami berhasrat untuk membantu pemaju membina pelanggan HTTP yang cekap dan mantap.

Tutorial ini terperinci bagaimana untuk memproses arraylists bersarang dengan cekap yang mengandungi arraylists lain di Java dan menggabungkan semua elemen dalamannya ke dalam satu array. Artikel ini akan menyediakan dua penyelesaian teras melalui operasi flatmap API Java 8 Stream: pertama meratakan ke dalam senarai dan kemudian mengisi array, dan secara langsung mewujudkan array baru untuk memenuhi keperluan senario yang berbeza.

Gunakan kelas Properties untuk membaca fail konfigurasi Java dengan mudah. 1. Masukkan config.properties ke dalam direktori sumber, muatkannya melalui getClassLoader (). 2. Jika fail berada di laluan luaran, gunakan FileInputStream untuk memuatkannya. 3. Gunakan GetProperty (Key, DefaultValue) untuk mengendalikan kekunci yang hilang dan memberikan nilai lalai untuk memastikan pengendalian pengecualian dan pengesahan input.
