1. Inovasi di Java 8: Pemrograman fungsional

Dengan dirilisnya Java 8, bahasa tersebut memperoleh dukungan kuat untuk pemrograman fungsional . Anda bahkan bisa mengatakan itu mendapatkan dukungan yang telah lama ditunggu-tunggu untuk pemrograman fungsional. Pengkodean menjadi lebih cepat, meskipun kode lebih sulit dibaca 🙂

Sebelum mempelajari pemrograman fungsional di Java, sebaiknya Anda memahami tiga hal dengan baik:

  1. OOP, pewarisan, dan antarmuka ( Level 1-2 dalam pencarian Java Core ).
  2. Implementasi metode default dalam sebuah interface .
  3. Kelas batin dan anonim .

Kabar baiknya adalah Anda tidak perlu mengetahui semua ini untuk menggunakan banyak fitur pemrograman fungsional di Java. Kabar buruknya adalah akan sulit untuk memahami dengan tepat bagaimana semuanya diatur dan bagaimana semuanya bekerja tanpa mengetahui tentang kelas dalam anonim.

Dalam pelajaran yang akan datang, kita akan fokus pada betapa mudah dan sederhananya menggunakan fitur pemrograman fungsional Java, tanpa pemahaman mendalam tentang cara kerjanya.

Butuh waktu berbulan-bulan untuk memahami semua nuansa pemrograman fungsional di Java. Anda dapat belajar membaca kode tersebut dalam beberapa jam. Jadi kami sarankan mulai dari yang kecil. Bahkan jika itu dengan aliran I/O.


2. Stream I/O: stream pipeline

Apakah Anda ingat bahwa sekali waktu Anda belajar tentang aliran I/O: InputStream, OutputStream, Reader, Writerdll.?

Ada kelas aliran yang membaca data dari sumber data , seperti FileInputSteam, dan ada aliran data perantara yang membaca data dari aliran lain, seperti InputStreamReaderdan BufferedReader.

Aliran ini dapat diatur ke dalam pipa pemrosesan data. Misalnya, seperti ini:

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

String text = buff.readLine();

Penting untuk dicatat bahwa dalam beberapa baris kode pertama, kita hanya membuat rangkaian Streamobjek. Data belum melewati pipa.

Tetapi segera setelah kita memanggil buff.readLine()metode tersebut, hal berikut akan terjadi:

  1. Objek BufferedReadermemanggil read()metode pada InputStreamReaderobjek
  2. Objek InputStreamReadermemanggil read()metode pada FileInputStreamobjek
  3. Objek FileInputStreammulai membaca data dari file

Dengan kata lain, tidak ada pergerakan data sepanjang aliran pipa sampai kita mulai memanggil metode seperti read()atau readLine(). Konstruksi aliran pipa belaka tidak menggerakkan data melaluinya. Aliran itu sendiri tidak menyimpan data. Mereka hanya membaca dari orang lain.

Koleksi dan aliran

Dimulai dengan Java 8, menjadi mungkin untuk mendapatkan aliran untuk membaca data dari koleksi (dan tidak hanya dari mereka). Tapi ini bukan hal yang paling menarik. Ini benar-benar menjadi mungkin untuk dengan mudah dan sederhana membangun rantai aliran data yang rumit. Dan dengan demikian, kode yang sebelumnya membutuhkan 5-10 baris kini dapat ditulis dalam 1-2 baris.

Contoh menemukan string terpanjang dalam daftar string:

Menemukan string 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. Streamantarmuka

Dukungan tambahan Java 8 untuk aliran diimplementasikan menggunakan antarmuka Stream<T>, di mana Tadalah parameter tipe yang menunjukkan jenis data yang diteruskan dalam aliran. Dengan kata lain, aliran benar-benar tidak bergantung pada jenis data yang dilewatinya.

Untuk mendapatkan objek aliran dari koleksi , panggil saja stream()metodenya. Kodenya kira-kira seperti ini:

Stream<Type> name = collection.stream();
Mendapatkan streaming dari koleksi

Dalam hal ini, kumpulan akan dianggap sebagai sumber data aliran, dan objek Stream<Type>akan menjadi alat untuk memperoleh data dari kumpulan dalam bentuk aliran data.

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

Omong-omong, Anda bisa mendapatkan aliran tidak hanya dari koleksi, tetapi juga dari array . Untuk melakukan ini, Anda perlu menggunakan metode ini. Misalnya:Arrays.stream()

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

Dalam hal ini, larik akan dianggap sebagai sumber data untuk aliran yang disebut name.

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

Tidak ada data yang dipindahkan saat Stream<Type>objek dibuat. Kami hanya mendapatkan objek aliran untuk mulai membangun aliran pipa.