1. Inovasi dalam Java 8: Pengaturcaraan fungsional

Dengan keluaran Java 8, bahasa itu mendapat sokongan yang kuat untuk pengaturcaraan berfungsi . Anda juga boleh mengatakan ia mendapat sokongan yang lama ditunggu-tunggu untuk pengaturcaraan berfungsi. Pengekodan menjadi lebih pantas, walaupun kod itu lebih sukar dibaca 🙂

Sebelum mempelajari pengaturcaraan berfungsi dalam Java, kami mengesyorkan agar anda memahami tiga perkara dengan baik:

  1. OOP, warisan dan antara muka ( Tahap 1-2 dalam pencarian Java Core ).
  2. Pelaksanaan kaedah lalai dalam antara muka .
  3. Kelas dalaman dan tanpa nama .

Berita baiknya ialah anda tidak perlu mengetahui semua ini untuk menggunakan banyak ciri pengaturcaraan berfungsi dalam Java. Berita buruknya ialah sukar untuk memahami dengan tepat bagaimana segala-galanya diatur dan cara semuanya berfungsi tanpa mengetahui tentang kelas dalaman tanpa nama.

Dalam pelajaran yang akan datang, kami akan memberi tumpuan kepada betapa mudah dan mudahnya menggunakan ciri pengaturcaraan berfungsi Java, tanpa pemahaman yang mendalam tentang cara ia berfungsi.

Ia mengambil masa berbulan-bulan untuk memahami semua nuansa pengaturcaraan berfungsi di Jawa. Anda boleh belajar membaca kod sedemikian dalam beberapa jam. Jadi kami cadangkan bermula dari kecil. Walaupun ia dengan aliran I/O.


2. Aliran I/O: saluran paip aliran

Adakah anda masih ingat bahawa suatu masa dahulu anda mengetahui tentang aliran I/O: InputStream, OutputStream, Reader, Writerdsb.?

Terdapat kelas strim yang membaca data daripada sumber data , seperti FileInputSteam, dan terdapat strim data perantaraan yang membaca data daripada strim lain, seperti InputStreamReaderdan BufferedReader.

Aliran ini boleh disusun ke dalam saluran paip pemprosesan data. Sebagai contoh, seperti ini:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

Adalah penting untuk ambil perhatian bahawa dalam beberapa baris pertama kod, kami hanya membina rantaian Streamobjek. Data belum melalui saluran paip lagi.

Tetapi sebaik sahaja kami memanggil buff.readLine()kaedah, perkara berikut akan berlaku:

  1. Objek BufferedReadermemanggil read()kaedah pada InputStreamReaderobjek
  2. Objek InputStreamReadermemanggil read()kaedah pada FileInputStreamobjek
  3. Objek FileInputStreammula membaca data daripada fail

Dalam erti kata lain, tiada pergerakan data di sepanjang saluran paip sehingga kami mula memanggil kaedah seperti read()atau readLine(). Pembinaan saluran paip aliran semata-mata tidak memacu data melaluinya. Aliran itu sendiri tidak menyimpan data. Mereka hanya membaca daripada orang lain.

Koleksi dan aliran

Bermula dengan Java 8, ia menjadi mungkin untuk mendapatkan aliran untuk membaca data daripada koleksi (dan bukan sahaja daripada mereka). Tetapi ini bukan perkara yang paling menarik. Ia sebenarnya menjadi mungkin untuk membina rantaian kompleks aliran data dengan mudah dan ringkas. Dan dengan berbuat demikian, kod yang sebelum ini mengambil 5-10 baris kini boleh ditulis dalam 1-2 baris.

Contoh mencari rentetan terpanjang dalam senarai rentetan:

Mencari rentetan terpanjang
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Streamantara muka

Sokongan lanjutan Java 8 untuk strim dilaksanakan menggunakan Stream<T>antara muka, dengan Tparameter jenis yang menunjukkan jenis data yang dihantar dalam strim. Dalam erti kata lain, strim adalah bebas sepenuhnya daripada jenis data yang dilaluinya.

Untuk mendapatkan objek strim daripada koleksi , hanya panggil stream()kaedahnya. Kod kelihatan lebih kurang seperti ini:

Stream<Type> name = collection.stream();
Mendapat strim daripada koleksi

Dalam kes ini, koleksi akan dianggap sebagai sumber data aliran, dan Stream<Type>objek akan menjadi alat untuk mendapatkan data daripada koleksi dalam bentuk aliran data.

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

Dengan cara ini, anda boleh mendapatkan strim bukan sahaja daripada koleksi, tetapi juga daripada tatasusunan . Untuk melakukan ini, anda perlu menggunakan kaedah. Sebagai contoh:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
Mendapatkan aliran daripada tatasusunan

Dalam kes ini, tatasusunan akan dianggap sebagai sumber data untuk strim yang dipanggil name.

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Tiada data dialihkan apabila Stream<Type>objek dibuat. Kami hanya mendapat objek aliran untuk mula membina saluran paip aliran.