Ekspresi lambda tidak mengubah kumpulan masalah yang dapat Anda selesaikan dengan Java secara umum, tetapi yang pasti membuat pemecahan masalah tertentu lebih mudah, hanya untuk alasan yang sama kami tidak lagi memprogram dalam bahasa assembly. Menghapus tugas yang berlebihan dari pekerjaan programmer membuat hidup lebih mudah dan memungkinkan untuk melakukan hal-hal yang bahkan tidak akan Anda sentuh sebaliknya, hanya untuk jumlah kode yang harus Anda hasilkan (secara manual).
Tetapi ekspresi lambda tidak hanya menyimpan baris kode. Ekspresi Lambda memungkinkan Anda untuk menentukan fungsi , sesuatu yang dapat Anda gunakan kelas dalam anonim sebagai solusi sebelumnya, itulah mengapa Anda bisa mengganti kelas dalam anonim dalam kasus ini, tetapi tidak secara umum.
Terutama, ekspresi lambda didefinisikan secara independen ke antarmuka fungsional tempat mereka akan dikonversi, sehingga tidak ada anggota yang diwariskan yang dapat mereka akses, lebih jauh, mereka tidak dapat mengakses instance dari tipe yang mengimplementasikan antarmuka fungsional. Dalam ungkapan lambda, this
dan super
memiliki arti yang sama dengan konteks sekitarnya, lihat juga jawaban ini . Selain itu, Anda tidak dapat membuat variabel lokal baru yang membayangi variabel lokal dari konteks sekitarnya. Untuk tugas yang dimaksudkan dalam mendefinisikan suatu fungsi, tindakan ini menghapus banyak sumber kesalahan, tetapi juga menyiratkan bahwa untuk kasus penggunaan lain, mungkin ada kelas dalam anonim yang tidak dapat diubah menjadi ekspresi lambda, meskipun mengimplementasikan antarmuka fungsional.
Lebih lanjut, new Type() { … }
jaminan konstruksi untuk menghasilkan instance baru yang berbeda (seperti new
biasa). Instance kelas dalam anonim selalu menyimpan referensi ke instans luarnya jika dibuat dalam non- static
konteks. Sebaliknya, ekspresi lambda hanya menangkap referensi this
saat dibutuhkan, yaitu jika mereka mengakses this
atau bukan static
anggota. Dan mereka menghasilkan instance dari identitas yang sengaja tidak ditentukan, yang memungkinkan implementasi untuk memutuskan pada waktu proses apakah akan menggunakan kembali instance yang ada (lihat juga " Apakah ekspresi lambda membuat objek di heap setiap kali dijalankan? ").
Perbedaan ini berlaku untuk contoh Anda. Konstruksi kelas dalam anonim Anda akan selalu menghasilkan instance baru, juga dapat menangkap referensi ke instance luar, sedangkan Anda (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
adalah ekspresi lambda non-capturing yang akan mengevaluasi ke singleton dalam implementasi tipikal. Selanjutnya, itu tidak menghasilkan .class
file di hard drive Anda.
Mengingat perbedaan terkait keduanya, semantik dan kinerja, ekspresi lambda dapat mengubah cara pemrogram akan memecahkan masalah tertentu di masa mendatang, tentu saja, juga karena API baru yang merangkul gagasan pemrograman fungsional yang memanfaatkan fitur bahasa baru. Lihat juga ekspresi lambda Java 8 dan nilai kelas satu .
(o1, o2) -> o1.getName().compareTo(o2.getName())