Pada implementasi JRE saat ini, Function.identity()
akan selalu mengembalikan instance yang sama sementara setiap kemunculan identifier -> identifier
tidak hanya akan membuat instance sendiri tetapi bahkan memiliki kelas implementasi yang berbeda. Untuk detail lebih lanjut, lihat di sini .
Alasannya adalah bahwa kompiler menghasilkan metode sintetis yang memegang tubuh sepele dari ekspresi lambda (dalam kasus x->x
, setara denganreturn identifier;
) dan memberitahu runtime untuk membuat implementasi dari antarmuka fungsional yang memanggil metode ini. Jadi runtime hanya melihat metode target yang berbeda dan implementasi saat ini tidak menganalisis metode untuk mengetahui apakah metode tertentu setara.
Jadi, Function.identity()
alih-alih menggunakan x -> x
mungkin menghemat memori, tetapi itu seharusnya tidak mendorong keputusan Anda jika Anda benar-benar berpikir itu x -> x
lebih mudah dibaca daripada Function.identity()
.
Anda juga dapat mempertimbangkan bahwa ketika kompilasi dengan informasi debug diaktifkan, metode sintetik akan memiliki atribut debug baris yang menunjuk ke baris kode sumber yang menahan ekspresi lambda, oleh karena itu Anda memiliki peluang untuk menemukan sumber Function
instance tertentu saat debugging . Sebaliknya, ketika menemukan instance yang dikembalikan oleh Function.identity()
selama debugging suatu operasi, Anda tidak akan tahu siapa yang memanggil metode itu dan meneruskan instance tersebut ke operasi.