JavaRush /Java Blog /Random-ID /Lambdas dan aliran, hanya praktik, tidak ada teori

Lambdas dan aliran, hanya praktik, tidak ada teori

Dipublikasikan di grup Random-ID
Halo semua. Pada kesempatan kompetisi, saya memutuskan untuk menulis bukan artikel di sini, melainkan pelajaran singkat. Ini tentang lambda dan aliran di Jawa. Jika Anda sudah familiar dan menggunakannya, langsung saja ke akhir artikel, akan ada sedikit pilihan tugas dengan JavaRush yang bisa Anda praktikkan. Anda memerlukan Java 8 dan lebih tinggi, pelatihan dari JR, akan ada sedikit detail dan banyak hal yang tidak dapat dipahami, keinginan kuat untuk memahaminya. Mari kita mulai dengan fakta bahwa saya tidak akan menjelaskan sejarah kemunculan lambda dan aliran, saya sendiri tidak mengetahuinya. Saya hanya tahu bahwa mereka berasal dari gaya pemrograman fungsional, hingga gaya OOP kami. Dalam pengalaman belajar singkat saya, saya hanya menunjukkan bagaimana dan apa, beberapa orang sulit memahami idenya, jadi ingat saja bagaimana cara menulisnya, nanti Anda akan mengerti.

Lambda

Lambdas dan aliran, hanya praktik, tanpa teori - 1Lambdas dan aliran, hanya praktik, tanpa teori - 2Jika Anda sama sekali tidak tahu apa itu lambda, maka: Lambda terlihat seperti ini:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Itu sudah cukup untuk saat ini. Anda bisa membaca teorinya di sini: link one , link two , tapi menurut saya latihannya jauh lebih menyenangkan. Saya sarankan Anda menyelesaikan soal berikut: Tulis kalkulator menggunakan metode 1. Metode ini harus menerima 2 nilai digital dan yang lainnya. Kode Anda akan terlihat seperti ini:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Anda perlu memasukkan 3 parameter dalam tanda tangan metode calculate, menambahkan 1 perintah returndan menguji pemanggilan metode ini main. Apa yang seharusnya bisa dilakukan oleh metode ini?
  • melipat;
  • berkembang biak;
  • membagi;
  • mengurangi;
  • hitung akarnya;
  • meningkatkan kekuatan;
  • pangkatkan jumlah argumen dibagi angka pertama + 117;
  • dan semua operasi lain yang dapat Anda pikirkan.
Apa yang tidak boleh digunakan:
  • if-else;
  • charsebagai indikator operasi;
  • switch-case;
  • dan segala hal lain yang terlintas dalam pikiran Anda.
Apa yang dapat Anda gunakan:
  • Hanya lambda, tugasnya ada pada mereka.
- Apa? Dan itu saja? - Ya, itu saja, karena Anda benar-benar perlu menambahkan 3 baris, jika saya menyarankan setidaknya satu, sisanya akan ditulis secara otomatis. Dan jika mau, Anda bisa google contohnya dan mencoba memahaminya. Tentu saja, Anda akan memeriksa diri sendiri dan jika Anda curang, tidak akan ada yang tahu, tapi mengapa? Setelah memecahkan masalah sederhana ini, 1,5 siswa saya memperoleh pemahaman kasar tentang apa itu lambda dan bagaimana menggunakannya. Ini akan sangat diperlukan untuk streaming. Jika Anda ingin membual tentang hasilnya dan mengetahui apakah Anda melakukannya dengan benar, kirimkan kodenya melalui pesan pribadi. Tidak perlu berkomentar, Anda bisa menambahkan tips menarik disana (tapi sedemikian rupa agar tidak membuat tugas terlalu mudah). Sekali lagi, setelah menyelesaikan contoh ini, Anda seharusnya sudah memiliki pemahaman kasar tentang cara menggunakan lambda.
Lambdas dan aliran, hanya praktik, tanpa teori - 3
Sekarang mari kita beralih ke aliran java. Ini bukanlah aliran yang mungkin Anda, pembaca, pikirkan. Tidak, bukan itu inputStreamdan bukan itu OutputStream. Berbeda, lebih menarik. Aliran telah menggantikan siklus, tidak sepenuhnya, tapi tetap saja. Mereka disuguhkan dengan motto “jangan jelaskan bagaimana melakukannya, jelaskan apa yang harus 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 terjadi di sini? Mari tambahkan komentar:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Bandingkan dengan loop 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);
}
Saat Anda membaca kodenya, semuanya tampak menakutkan, tetapi apakah lebih mudah dengan komentar? Ini normal, saya juga sudah lama tidak memahaminya. Kunci untuk memahami adalah latihan. Oleh karena itu, kami mulai membaca artikel pihak ketiga dan mencari jawaban atas pertanyaan kami, Anda juga dapat menanyakannya di sini di komentar, saya tidak akan memberikan jawaban lengkap, tetapi saya akan menunjukkan arahnya. Daftar tugas dari JavaRush yang menurut saya bagus untuk berlatih streaming:
  • 2208 - dapat diselesaikan dengan 1 aliran dan 1 pengembalian, mis. isi metode ini akan dimulai returndan kemudian akan ada 1 aliran utuh. Mari kita hilangkan persyaratannya StringBuilder.

  • 1908 - Anda juga dapat menyelesaikannya dengan 1 aliran dan 1 pengembalian. Dimulai dengan membaca file. Saya tidak tahu cara merekam ke file melalui stream (jika memungkinkan), untuk saat ini kami melakukannya secara manual. Itu. Kami hanya membuka 2 aliran (konsol dan menulis ke file). Kami membaca file melalui metode yang akan mengembalikan kami berupa sheet atau stream (google dan javadoc).

  • 1907 - secara teori, ini juga dapat diselesaikan dalam satu aliran. Masukan ke aliran adalah nama file, keluarannya adalah jumlah kata dunia.

Itu saja. Jika saya bisa, saya akan menulis cerita sederhana lainnya. Menurutku, membaca tentang sesuatu yang keren tanpa sempat mencobanya itu membosankan atau semacamnya. Dan setelah kalkulator dan 3 teka-teki, saya rasa Anda sudah terbiasa dengan lambda dan stream, jadi bacalah semua kemungkinan jika Anda belum melakukannya. UPD:
  • 1016 - dengan cara yang sedikit menyimpang, Anda dapat menyelesaikannya dalam 1 aliran dan 1 pengembalian;

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

    2 tugas ini akan memperkenalkan Anda pada metode streaming lain dan kolektor lain.

  • 1925 - Anda bisa mendapatkan baris kata-kata dalam satu aliran dan kemudian menulisnya ke file (saya tidak tahu apakah mungkin untuk menulis ke file dari aliran)

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