JavaRush /Blog Jawa /Random-JV /Aliran prasaja sing ora prasaja
Oleg Savenko
tingkat
Одесса

Aliran prasaja sing ora prasaja

Diterbitake ing grup
Kanthi saben versi anyar Jawa dadi sugih lan sugih. Nalika akeh kasugihan dumunung ing versi sadurungé, basa kasebut terus saya apik ing metodologi lan implementasine. Kolèksi ing Jawa ora ana sing istiméwa. Kerangka koleksi inti muncul ing J2SE 1.2 lan terus berkembang, ngalami owah-owahan sing luwih nyenengake tinimbang nguciwani. Kanthi rilis JDK 5, koleksi dadi luwih trep, luwih cepet, lan luwih gampang digarap. Iki nyebabake kasunyatan manawa programer wiwit ngeksploitasi kanthi luwih intensif. Pola tartamtu wis dikembangake kanggo nggarap wong-wong mau, sing tanpa mangu-mangu efektif. Nanging kanthi JDK 8, koleksi dadi luwih apik maneh, lan dadi luwih apik amarga benang. Temenan, amarga koleksi kasebut bisa diwakili ing bentuk stream, metodologi kanggo nggarap dheweke uga bakal diganti. Mula, aku pengin nuduhake kepiye solusi sing akrab lan dingerteni karo koleksi dadi luwih gampang.

Tuladha 1. Iku ora bisa dadi prasaja

Mesthi wae, ayo miwiti kanthi paling gampang, ayo ndeleng kabeh unsur koleksi lan nampilake kabeh unsur.
// создадим и заполним список
   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);
Kaya sing sampeyan ngerteni, ana sintaksis anyar sing, miturutku minangka wong anyar ing Jawa, luwih gampang. Dadi, apa sing katon ing sintaks anyar:
берем_список(list).превращаем_в_поток(stream).перебираем_все_элементы(forEach)(тут_интуитивно_понятно)
System.out::println— link menyang cara statis sing output string menyang console Tinimbang link menyang cara statis, sampeyan bisa nggunakake rada beda, entri kurang cetha:
list.stream().forEach(i -> System.out.println(i));
Entri iki nggunakake ekspresi lambda. Lan ya, kanggo sinau cara nggarap stream, sampeyan kudu sinau ekspresi lambda - pancen apik banget. Salajengipun, aku ora bakal nuduhake carane nggarap koleksi mung nggunakake stream, gumantung ing kasunyatan sing dadi menowo karo cara tradisional sak Course.

Conto 2. Temokake nilai sing padha ing dhaptar lan tampilake ing konsol

list.stream().filter(i -> i%2==0).forEach(System.out::println);
Kabeh masalah wis ditanggulangi ing siji baris. Mugi sampeyan seneng bisa ing siji baris. Nggunakake metode kasebut, filterkita nyaring stream lan ngasilake apa sing isih ana ing konsol. Filter minangka barang sing kuat banget sing bisa mbantu ing kasus sing ora dikarepake. Ayo dadi kreatif lan ngganti kahanan masalah. Contone, kita kudu ngetung pira nomer genap ing dhaptar:
long count = list.stream().filter(i -> i%2==0).count();
Lan maneh ing siji baris. Piye wae kabeh katon prasaja. Ing panyaring, kita nggunakake ekspresi lambda, saéngga mung nempatake nomer genap ing aliran anyar, banjur ditrapake menyang aliran anyar count, sing ngitung jumlah unsur ing aliran anyar.

Tuladha 3. Etang cacahe tembung ing daftar sing dawane 5 aksara

Kita wis muter karo integer, saiki ayo muter karo tembung.
List<String> list = new ArrayList<>();
Collections.addAll(list, "разые", "слова", "интересные", "And", "Not", "Very");

System.out.println(list.stream().filter(w -> w.length() == 5).count());
Kita nggunakake filter maneh. Ing saringan, nggunakake ekspresi lambda, stream anyar ditampilake, banjur, bisa dingerteni, countaku ngitung pirang-pirang unsur ing aliran anyar.

Tuladha 4. Print tembung unik

Tugas sing akrab nalika maca macem-macem tembung menyang koleksi saka file, lan saiki mung butuh sing unik.
List<String> list = new ArrayList<>();
Collections.addAll(list, "Vasya", "Таня", "Olya", "Vasya", "Olya", "Сергей");

list.stream().distinct().forEach(System.out::println);
Tumindak utama ditindakake ing stream nggunakake distinct. Sabanjure, aku saranake ndeleng sawetara tugas saka kursus nggunakake benang

Tuladha 5. Tembung dawa

Ing Java Core tingkat 9, ing kuliah 11 ana masalah sing menarik, sampeyan kudu nulis tembung sing dipisahake karo koma ing File2, sing dawane luwih gedhe tinimbang 6. Apa wae taman sing sampeyan pager, Aku ngusulake solusi ing ngisor iki:
  1. Saka file sumber kita maca kabeh tembung menyang dhaptar.

  2. Banjur kita nglakokake baris ing ngisor iki

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

Mangkene solusi sing menarik nggunakake benang. Filter disaring, lan nggunakake nyuda lan ekspresi reguler, string sing dibutuhake digawe.

Tuladha 6. Tembung kanthi wilangan

Tulis kabeh tembung sing ngemot angka, contone, a1 utawa abc3d, dipisahake karo spasi ing File2. Iki uga minangka syarat saka buku masalah kita, kaya sing sampeyan bayangake, solusi kasebut gampang.
Optional<String> rezult = list.stream()
				.filter(w->w.matches(".*?\\d+.*?"))
				.reduce((w1,w2)->w1+" "+w2);
Kita nyaring stream nggunakake expression biasa, banjur ngurangi lan expression lambda. Dadi akeh sing padha karo tugas sadurunge.

Tuladha 7. Milih angka

Kabeh tugas muni kaya iki:
  • Waca 2 jeneng file saka console.
  • Output menyang file kapindho kabeh nomer sing ana ing file pisanan.
  • Nomer dipisahake dening spasi.
  • Nutup aliran.
Kanggo tugas utama, yaiku nulis angka menyang senar sing dipisahake dening spasi, kanggo nulis luwih lanjut menyang file, aku saranake nggunakake stream, bakal katon kaya iki:
Optional<String> rezult = list.stream().filter(w->w.matches("\\d+"))
				.reduce((w1,w2)->w1+" "+w2);
System.out.println(rezult.get());
Nggunakake benang, masalah ditanggulangi kanthi cara sing gampang banget. Nanging, lah, mbandhingake solusi iki karo loro sing sadurunge. Mungkasi artikel, aku pengin ngakoni sampeyan: wong lanang, aku ngapusi nalika milih conto. Kasunyatane yaiku aku milih conto sing paling gampang kanggo nuduhake topik sing ora dingerteni nggunakake masalah sing akrab. Mesthine, benang digunakake kanggo tugas sing prasaja lan luwih rumit. Nanging minangka Horstman nandheske ing bukunipun, "Data mili operate ing asas saka" apa, ora carane nindakake. Aku ora ngerti babagan sampeyan, nanging aku seneng karo alirane, muga-muga aku ora ngalangi sampeyan sinau. Lan mugi kula nerangaken satunggal bab:
  1. Aku ora arep mulang sing maca babagan nggunakake stream ing koleksi; Aku dudu guru sing berpengalaman. Aku pengin nuduhake yen thread iku prasaja lan menarik banget! Umumé, iki minangka kabutuhan.
  2. Sing liyane aku ngerti aliran, liyane aku weruh masalah ngendi padha ngatasi kabeh masalah saka buku kursus, kang tegese mili padha ora nemokke muspra.
  3. Aliran ora mung gampang digarap, nanging uga duwe kauntungan sing penting - nalika nggarap data sing akeh, stream asring luwih produktif.
PS . Aku guyon bab ALL MASALAH. Rekomendasi: Pustaka Java Profesional. Volume 2 Alat pemrograman lanjutan. Kay Horstmann. Aku duwe edisi sepuluh.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION