JavaRush /Java Blog /Random-ID /Aliran sederhana yang tidak sederhana
Oleg Savenko
Level 41
Одесса

Aliran sederhana yang tidak sederhana

Dipublikasikan di grup Random-ID
Dengan setiap versi baru Java, Java menjadi semakin kaya. Meskipun sebagian besar kekayaannya terletak pada versi sebelumnya, bahasanya terus mengalami peningkatan baik dalam metodologi maupun implementasinya. Koleksi di Jawa tidak terkecuali. Kerangka koleksi inti muncul di J2SE 1.2 dan terus berkembang, mengalami perubahan yang lebih menyenangkan daripada mengecewakan. Dengan dirilisnya JDK 5, koleksi menjadi lebih nyaman, cepat, dan mudah digunakan. Hal ini menyebabkan pemrogram mulai mengeksploitasinya secara lebih intensif. Pola-pola tertentu telah dikembangkan untuk bekerja dengan mereka, yang tidak diragukan lagi efektif. Namun dengan JDK 8, koleksi menjadi lebih baik lagi, dan menjadi lebih baik berkat thread. Tentunya, karena koleksi tersebut dapat direpresentasikan dalam bentuk aliran, metodologi pengerjaannya juga akan berubah. Oleh karena itu, saya ingin menunjukkan bagaimana solusi koleksi yang familier dan mudah dipahami menjadi lebih sederhana.

Contoh 1. Ini sangat sederhana

Tentu saja, mari kita mulai dengan hal yang paling sederhana, menelusuri semua elemen koleksi dan menampilkan semua elemen.
// создадим и заполним список
   List<Integer> list = new ArrayList<>();
   Collections.addAll(list, 1, 5, 6, 11, 3, 15, 7, 8);
   // а теперь
   // быстрый for по всем elementм, только для коллекций
   for (Integer i:list){
       System.out.println(i);
   }
   //но мы уже живем в JDK 8
   //а значит нужно так
   list.stream().forEach(System.out::println);
Seperti yang Anda perhatikan, ada sintaks baru yang, menurut saya sebagai pemula Java, jauh lebih sederhana. Jadi, apa yang terlihat di sintaks baru:
берем_список(list).превращаем_в_поток(stream).перебираем_все_элементы(forEach)(тут_интуитивно_понятно)
System.out::println— link ke metode statis yang mengeluarkan string ke konsol Daripada link ke metode statis, Anda dapat menggunakan entri yang sedikit berbeda dan kurang jelas:
list.stream().forEach(i -> System.out.println(i));
Entri ini menggunakan ekspresi lambda. Dan ya, untuk mempelajari cara bekerja dengan aliran, Anda perlu mempelajari ekspresi lambda - ekspresi tersebut luar biasa. Selanjutnya, saya tidak akan menunjukkan cara bekerja dengan koleksi hanya menggunakan aliran, dengan mengandalkan fakta bahwa Anda sudah familiar dengan metode tradisional selama kursus.

Contoh 2. Temukan nilai genap dalam daftar dan tampilkan di konsol

list.stream().filter(i -> i%2==0).forEach(System.out::println);
Seluruh masalah diselesaikan dalam satu baris. Saya harap Anda menikmati bekerja dalam satu baris. Dengan menggunakan metode ini, filterkami memfilter aliran dan menampilkan apa yang tersisa di konsol. Filter adalah hal yang sangat kuat yang dapat membantu dalam kasus yang paling tidak terduga. Mari berkreasi dan mengubah kondisi permasalahan. Misalnya, kita perlu menghitung berapa banyak bilangan genap dalam daftar:
long count = list.stream().filter(i -> i%2==0).count();
Dan lagi dalam satu baris. Entah bagaimana semuanya tampak sederhana. Dalam filter, kami menggunakan ekspresi lambda, sehingga hanya menempatkan bilangan genap di aliran baru, dan kemudian menerapkannya ke aliran baru count, yang menghitung berapa banyak elemen yang ada di aliran baru.

Contoh 3. Mari kita hitung berapa banyak kata dalam daftar yang panjangnya 5 karakter

Kita telah bermain dengan bilangan bulat, sekarang mari bermain dengan kata-kata.
List<String> list = new ArrayList<>();
Collections.addAll(list, "разые", "слова", "интересные", "And", "Not", "Very");

System.out.println(list.stream().filter(w -> w.length() == 5).count());
Kami menggunakan filter lagi. Dalam filter, menggunakan ekspresi lambda, aliran baru ditampilkan, dan kemudian, tentu saja, countsaya menghitung berapa banyak elemen yang ada di aliran baru.

Contoh 4. Cetak kata-kata unik

Tugas yang lazim ketika kita membaca banyak kata berbeda ke dalam kumpulan dari sebuah file, dan sekarang kita hanya membutuhkan kata-kata unik.
List<String> list = new ArrayList<>();
Collections.addAll(list, "Vasya", "Таня", "Olya", "Vasya", "Olya", "Сергей");

list.stream().distinct().forEach(System.out::println);
Tindakan utama dilakukan pada aliran menggunakan distinct. Selanjutnya, saya mengusulkan untuk melihat beberapa tugas kita dari kursus menggunakan utas

Contoh 5. Kata-kata yang panjang

Pada Java Core level 9, pada kuliah 11 ada masalah yang menarik, di dalamnya Anda perlu menulis kata-kata yang dipisahkan dengan koma di File2, yang panjangnya lebih dari 6. Tidak peduli jenis taman apa yang Anda pagar, Saya mengusulkan solusi berikut:
  1. Dari file sumber kami membaca semua kata yang ada dalam daftar.

  2. Kemudian kita jalankan baris berikut

    Optional<String> rezult = list.stream()
    				.filter(w->w.length()>6)
    				.reduce((w1,w2)->w1+", "+w2);
  3. result.get()menulis ke file.

Inilah solusi menarik menggunakan utas. Filter memfilter, dan menggunakan pengurangan dan ekspresi reguler, string yang diperlukan dibuat.

Contoh 6. Kata-kata dengan angka

Tulis semua kata yang mengandung angka, misalnya a1 atau abc3d, dipisahkan dengan spasi di File2. Ini juga syarat dari buku soal kita, seperti yang sudah anda duga, solusinya sederhana.
Optional<String> rezult = list.stream()
				.filter(w->w.matches(".*?\\d+.*?"))
				.reduce((w1,w2)->w1+" "+w2);
Kami memfilter aliran menggunakan ekspresi reguler, lalu mengurangi dan ekspresi lambda. Banyak kesamaan dengan tugas sebelumnya.

Contoh 7. Memilih nomor

Seluruh tugasnya terdengar seperti ini:
  • Baca 2 nama file dari konsol.
  • Keluarkan ke file kedua semua nomor yang ada di file pertama.
  • Angka dipisahkan dengan spasi.
  • Tutup aliran.
Untuk tugas pokoknya yaitu menulis angka ke dalam string yang dipisahkan spasi, untuk selanjutnya menulis ke file saya sarankan menggunakan stream, tampilannya akan seperti ini:
Optional<String> rezult = list.stream().filter(w->w.matches("\\d+"))
				.reduce((w1,w2)->w1+" "+w2);
System.out.println(rezult.get());
Dengan menggunakan utas, masalahnya diselesaikan dengan cara yang sangat sederhana. Tapi, lihatlah, bandingkan sendiri solusi ini dengan dua solusi sebelumnya. Sebagai penutup artikel, saya ingin mengaku kepada Anda: teman-teman, saya curang ketika memilih contoh. Faktanya adalah saya memilih contoh paling sederhana untuk menunjukkan kepada Anda topik asing menggunakan masalah yang sudah dikenal. Tentu saja, thread digunakan untuk tugas yang sederhana dan lebih kompleks. Namun seperti yang ditekankan Horstman dalam bukunya, “Aliran data beroperasi berdasarkan prinsip “apa, bukan bagaimana melakukan.”,” yang berarti banyak tugas yang sebelumnya rumit bisa menjadi lebih sederhana. Saya tidak tahu tentang Anda, tapi saya menyukai alurnya, saya harap saya tidak menyurutkan semangat Anda untuk mempelajarinya. Dan izinkan saya menjelaskan satu hal lagi:
  1. Saya tidak bermaksud mengajari pembaca cara menggunakan aliran dalam koleksi; Saya bukan guru yang berpengalaman. Saya ingin menunjukkan kepada Anda bahwa thread itu sederhana dan sangat menarik! Secara umum, ini adalah suatu keharusan.
  2. Semakin saya memahami aliran, semakin saya melihat masalah yang menyelesaikan semua masalah dari buku pelajaran, yang berarti aliran tidak ditemukan dengan sia-sia.
  3. Streaming tidak hanya mudah digunakan, tetapi juga memiliki keuntungan penting - saat bekerja dengan data dalam jumlah besar, streaming seringkali lebih produktif.
PS . Saya bercanda tentang SEMUA MASALAH. Merekomendasikan: Perpustakaan Java profesional. Volume 2 Alat pemrograman tingkat lanjut. Kay Horstmann. Saya memiliki edisi kesepuluh.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION