JavaRush /Blog Java /Random-MS /Lambdas dan aliran, hanya amalan, tiada teori

Lambdas dan aliran, hanya amalan, tiada teori

Diterbitkan dalam kumpulan
Hai semua. Semasa pertandingan itu, saya memutuskan untuk menulis bukan artikel di sini, tetapi pengajaran pendek. Ia akan mengenai lambdas dan aliran di Jawa. Jika anda sudah biasa dan menggunakannya, kemudian langkau terus ke penghujung artikel, akan ada pilihan kecil tugasan dengan JavaRush yang boleh anda praktikkan. Anda memerlukan java 8 dan lebih tinggi, latihan dari JR, akan ada sedikit butiran dan banyak perkara yang tidak dapat difahami, keinginan yang kuat untuk memikirkannya. Mari kita mulakan dengan fakta bahawa saya tidak akan menerangkan sejarah kemunculan lambdas dan aliran, saya sendiri tidak mengetahuinya. Saya hanya tahu bahawa ia datang daripada gaya pengaturcaraan berfungsi, kepada gaya OOP kami. Dalam pengalaman pembelajaran singkat saya, saya sekadar menunjukkan bagaimana dan apa, ada yang sukar untuk memahami idea tersebut, jadi ingat sahaja cara menulis, anda akan faham nanti.

Lambdas

Lambdas dan aliran, hanya amalan, tiada teori - 1Lambdas dan aliran, hanya amalan, tiada teori - 2Jika anda tidak tahu apa itu lambda, maka: Lambda kelihatan seperti ini:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Cukuplah setakat ini. Anda boleh membaca teori di sini: pautan satu , pautan dua , tetapi saya fikir latihan adalah lebih menyeronokkan. Saya cadangkan anda menyelesaikan masalah berikut: Tulis kalkulator menggunakan kaedah 1. Kaedah ini harus menerima 2 nilai digital dan sesuatu yang lain. Kod anda akan kelihatan seperti ini:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Anda perlu memasukkan 3 parameter dalam tandatangan kaedah calculate, tambah 1 arahan returndan uji memanggil kaedah ini dalam main. Apakah kaedah ini boleh dilakukan?
  • lipat;
  • membiak;
  • bahagikan;
  • tolak;
  • hitung punca;
  • meningkatkan kuasa;
  • naikkan kepada kuasa jumlah hujah dibahagikan dengan nombor pertama + 117;
  • dan semua operasi lain yang boleh anda fikirkan.
Apa yang tidak boleh digunakan:
  • if-else;
  • charsebagai penunjuk operasi;
  • switch-case;
  • dan segala-galanya yang terlintas di fikiran anda.
Apa yang anda boleh gunakan:
  • Hanya lambda, tugas ditanggung mereka.
- Apa? Dan itu semua? - Ya, itu sahaja, kerana anda benar-benar perlu menambah 3 baris, jika saya mencadangkan sekurang-kurangnya satu, selebihnya akan ditulis secara automatik. Dan jika anda mahu, anda boleh google contoh dan cuba memahami. Sudah tentu, anda akan menyemak sendiri dan jika anda menipu, tiada siapa yang akan tahu, tetapi mengapa? Setelah menyelesaikan masalah yang begitu mudah, semua 1.5 pelajar saya mendapat pemahaman kasar tentang apa itu lambda dan cara menggunakannya. Ini akan sangat diperlukan untuk penstriman. Jika anda ingin membual tentang hasilnya dan mengetahui sama ada anda melakukannya dengan betul, hantar kod dalam mesej peribadi. Tidak perlu mengulas; anda boleh menambah petua menarik di sana (tetapi dengan cara yang tidak menjadikan tugas terlalu mudah). Sekali lagi, setelah menyelesaikan contoh ini, anda sepatutnya sudah mempunyai pemahaman kasar tentang cara menggunakan lambdas.
Lambdas dan aliran, hanya amalan, tiada teori - 3
Sekarang mari kita beralih ke aliran java. Ini bukan aliran yang mungkin anda, pembaca, fikirkan. Tidak, tidak inputStreamdan tidak OutputStream. Ia berbeza, ia lebih menarik. Strim telah menggantikan kitaran, tidak sepenuhnya, tetapi masih. Mereka dihidangkan dengan moto "jangan terangkan cara melakukannya, terangkan apa yang perlu dilakukan." Contoh kecil aliran:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Apa yang berlaku di sini? Mari tambah komen:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Bandingkan dengan gelung biasa:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Apabila anda membaca kod, semuanya kelihatan menakutkan, tetapi adakah lebih mudah dengan komen? Ini adalah perkara biasa, saya juga tidak memahami mereka untuk masa yang lama. Kunci untuk memahami adalah amalan. Oleh itu, kami mula membaca artikel pihak ketiga dan mencari jawapan kepada soalan kami, anda juga boleh bertanya kepada mereka di sini dalam komen, saya tidak akan memberikan jawapan penuh, tetapi saya akan menunjukkan arahnya. Senarai tugas daripada JavaRush yang saya fikir bagus untuk berlatih penstriman:
  • 2208 - boleh diselesaikan dengan 1 aliran dan 1 pulangan, i.e. badan kaedah akan bermula dengan returndan kemudian akan ada 1 aliran keseluruhan. Mari tinggalkan keperluan itu StringBuilder.

  • 1908 - anda juga boleh menyelesaikannya dengan 1 aliran dan 1 pulangan. Bermula dengan membaca fail. Saya tidak tahu cara merakam ke fail melalui strim (jika ini boleh), buat masa ini kami melakukannya secara manual. Itu. Kami hanya membuka 2 aliran (konsol dan menulis ke fail). Kami membaca fail melalui kaedah yang akan mengembalikan kami sama ada helaian atau aliran (google dan javadoc).

  • 1907 - secara teori, ia juga boleh diselesaikan dalam satu aliran. Input kepada strim ialah nama fail, output ialah bilangan perkataan dunia.

Itu sahaja. Jika saya boleh, saya akan menulis satu lagi cerita mudah. Pada pendapat saya, membaca tentang sesuatu yang menarik tanpa peluang untuk mencubanya entah bagaimana membosankan atau sesuatu. Dan selepas kalkulator dan 3 teka-teki, saya rasa anda sudah bergaul dengan baik dengan lambda dan strim, jadi baca tentang semua kemungkinan jika anda belum melakukannya. UPD:
  • 1016 - dengan cara yang sedikit sesat, anda boleh menyelesaikannya dalam 1 aliran dan 1 pulangan;

  • 1821 - sangat mudah dan dalam 1 aliran dan 1 pulangan.

    2 tugasan ini akan memperkenalkan anda kepada kaedah penstriman lain dan pengumpul lain.

  • 1925 - anda boleh mendapatkan baris dengan perkataan dalam satu aliran dan kemudian menulisnya ke fail (saya tidak tahu sama ada mungkin untuk menulis ke fail dari aliran)

Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION