Lambda ifadeleri genel olarak Java ile çözebileceğiniz problemler kümesini değiştirmez, ancak belirli problemleri çözmeyi kesinlikle kolaylaştırır, sadece aynı nedenle artık assembly dilinde programlama yapmıyoruz. Gereksiz görevleri programcının çalışmasından kaldırmak hayatı kolaylaştırır ve başka türlü dokunmayacağınız şeyleri, yalnızca (manuel olarak) üretmeniz gereken kod miktarı için yapmanızı sağlar.
Ancak lambda ifadeleri yalnızca kod satırlarını kaydetmez. Lambda ifadeleri , daha önce geçici çözüm olarak anonim iç sınıfları kullanabileceğiniz işlevleri tanımlamanıza izin verir , bu nedenle bu durumlarda anonim iç sınıfları değiştirebilirsiniz, ancak genel olarak değil.
En önemlisi, lambda ifadeleri, dönüştürülecekleri işlevsel arabirimden bağımsız olarak tanımlanır, bu nedenle erişebilecekleri miras alınmış üyeler yoktur, ayrıca işlevsel arabirimi uygulayan türün örneğine erişemezler. Bir lambda ifadesi içinde this
ve super
çevresindeki bağlamında aynı anlama sahip, ayrıca bkz bu cevabı . Ayrıca, çevreleyen bağlamın yerel değişkenlerini gölgeleyen yeni yerel değişkenler oluşturamazsınız. Amaçlanan bir işlev tanımlama görevi için bu, birçok hata kaynağını ortadan kaldırır, ancak aynı zamanda diğer kullanım durumları için, işlevsel bir arabirim uygulansa bile bir lambda ifadesine dönüştürülemeyen anonim iç sınıflar olabileceği anlamına gelir.
Dahası, yapı new Type() { … }
yeni bir farklı örnek oluşturmayı garanti eder ( new
her zaman olduğu gibi). Anonim iç sınıf örnekleri, static
bağlam dışı olarak oluşturulmuşsa, her zaman dış örneklerine bir başvuru saklar . Buna karşılık, lambda ifadeleri, yalnızca bir başvuru yakalamak this
eriştikleri takdirde, ie gerektiğinde this
veya olmayan static
üyesi. Ayrıca, uygulamanın mevcut örnekleri yeniden kullanıp kullanmayacağına çalışma zamanında karar vermesine olanak tanıyan kasıtlı olarak belirtilmemiş bir kimliğin örneklerini üretirler (ayrıca bkz. " Bir lambda ifadesi, her yürütüldüğünde yığın üzerinde bir nesne oluşturur mu? ").
Bu farklılıklar örneğiniz için geçerlidir. Anonim iç sınıf yapınız her zaman yeni bir örnek üretir, ayrıca dış örneğe bir başvuru yakalayabilir, oysa sizin (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
tipik uygulamalarda bir tek ton olarak değerlendirilecek yakalamayan bir lambda ifadesidir. Ayrıca, .class
sabit sürücünüzde bir dosya oluşturmaz .
Hem anlamsal hem de performansla ilgili farklılıklar göz önüne alındığında, lambda ifadeleri, elbette, yeni dil özelliklerini kullanan işlevsel programlama fikirlerini benimseyen yeni API'ler nedeniyle programcıların gelecekte belirli sorunları çözme şeklini değiştirebilir. Ayrıca bkz. Java 8 lambda ifadesi ve birinci sınıf değerler .
(o1, o2) -> o1.getName().compareTo(o2.getName())