亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Jadual Kandungan
1. Latar belakang dan analisis keperluan
2. Pelaksanaan dan batasan kaedah lelaran tradisional
3. Gunakan API Stream Java untuk mencapai penukaran yang cekap
3.1 pengumpul.groupingby dan pengumpul.Mapping
3.2 Percubaan dan Pengoptimuman Awal
4. Langkah berjaga -jaga
5. Ringkasan
Rumah Java javaTutorial Java Stream mengimplementasikan kumpulan dan pemetaan data rentetan kompleks

Java Stream mengimplementasikan kumpulan dan pemetaan data rentetan kompleks

Oct 15, 2025 am 10:51 AM

Java Stream mengimplementasikan kumpulan dan pemetaan data rentetan kompleks

Artikel ini memperincikan cara menggunakan API Java Stream, terutama gabungan pengumpul.groupingby dan pengumpul. Memaparkan, untuk menukar rentetan dengan cekap dalam format tertentu ke dalam peta > struktur. Dengan membandingkan kaedah berulang tradisional dengan pemprosesan streaming aliran, ia menunjukkan cara melaksanakan pengumpulan data kompleks dan pemetaan nilai dengan cara yang ringkas dan deklaratif melalui operasi rantai dan pengoptimuman pra -proses, sangat meningkatkan kebolehbacaan dan kesederhanaan kod.

1. 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 >, di mana kunci peta adalah kod kawasan (bahagian sebelum $$), dan nilai (nilai) adalah senarai semua nama bandar di kawasan itu (bahagian selepas $$). Contoh hasil yang diharapkan adalah seperti berikut:

 {
  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 , di mana rentetan adalah rentetan lengkap asal (seperti "010 $$ fengtai"), bukannya senarai yang hanya mengandungi nama bandar seperti yang kita inginkan. Untuk menyelesaikan masalah ini, kita perlu memperkenalkan pemetaan sebagai pemungut hiliran dalam kumpulan:

 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 >. Berbanding dengan kaedah berulang tradisional, penyelesaian aliran menyediakan kesederhanaan kod yang lebih tinggi, kebolehbacaan dan deklarasi, dan merupakan alat penting untuk memproses data pengumpulan dalam pembangunan Java moden. Pada masa yang sama, kami juga membincangkan bagaimana untuk mengoptimumkan saluran paip aliran melalui pra -proses, dan menekankan keperluan untuk mempertimbangkan keseimbangan antara kekukuhan data dan prestasi dalam aplikasi praktikal. Menguasai teknologi ini akan membantu anda menulis lebih banyak aplikasi Java moden dan berkuasa.

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Bagaimana untuk menambah fail balang ke ClassPath di Java? Bagaimana untuk menambah fail balang ke ClassPath di Java? Sep 21, 2025 am 05:09 AM

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.

Cara membuat fail di Java Cara membuat fail di Java Sep 21, 2025 am 03:54 AM

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

Membina Aplikasi Extensible dengan Antara Muka Penyedia Perkhidmatan Java (SPI) Membina Aplikasi Extensible dengan Antara Muka Penyedia Perkhidmatan Java (SPI) Sep 21, 2025 am 03:50 AM

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.

Memahami Generik Java dan Wildcard Memahami Generik Java dan Wildcard Sep 20, 2025 am 01:58 AM

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

Bagaimana untuk melaksanakan antara muka di Java? Bagaimana untuk melaksanakan antara muka di Java? Sep 18, 2025 am 05:31 AM

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.

Pemahaman yang mendalam mengenai hubungan berterusan HTTP: Dasar dan amalan untuk menghantar pelbagai permintaan pada soket yang sama Pemahaman yang mendalam mengenai hubungan berterusan HTTP: Dasar dan amalan untuk menghantar pelbagai permintaan pada soket yang sama Sep 21, 2025 pm 01:51 PM

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 Java: Cara meratakan arraylist bersarang dan mengisi unsur -unsurnya ke dalam array Tutorial Java: Cara meratakan arraylist bersarang dan mengisi unsur -unsurnya ke dalam array Sep 18, 2025 am 07:24 AM

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.

Bagaimana cara membaca fail hartanah di Java? Bagaimana cara membaca fail hartanah di Java? Sep 16, 2025 am 05:01 AM

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.

See all articles