Ini setara tetapi tidak identik. Sederhananya, jika ekspresi lambda tidak menangkap nilai, itu akan menjadi singleton yang digunakan kembali pada setiap doa.
Perilaku tidak ditentukan secara spesifik. JVM diberi kebebasan besar tentang bagaimana mengimplementasikannya. Saat ini, JVM Oracle menciptakan (setidaknya) satu instance per ekspresi lambda (yaitu tidak berbagi instance antara ekspresi identik yang berbeda) tetapi membuat lajang untuk semua ekspresi yang tidak menangkap nilai.
Anda dapat membaca jawaban ini untuk lebih jelasnya. Di sana, saya tidak hanya memberikan deskripsi yang lebih rinci tetapi juga menguji kode untuk mengamati perilaku saat ini.
Ini dicakup oleh Spesifikasi Bahasa Java®, bab “ 15.27.4. Evaluasi Run-time tentang Ekspresi Lambda ”
Diringkas:
Aturan-aturan ini dimaksudkan untuk menawarkan fleksibilitas untuk implementasi bahasa pemrograman Java, dalam hal:
Objek baru tidak perlu dialokasikan pada setiap evaluasi.
Objek yang dihasilkan oleh ekspresi lambda yang berbeda tidak perlu milik kelas yang berbeda (jika badannya identik, misalnya).
Setiap objek yang dihasilkan oleh evaluasi tidak harus berasal dari kelas yang sama (misalnya, variabel lokal yang ditangkap dapat diuraikan, misalnya).
Jika "contoh yang ada" tersedia, itu tidak perlu dibuat pada evaluasi lambda sebelumnya (itu mungkin telah dialokasikan selama inisialisasi kelas lampiran, misalnya).