Soru Bir alana lamda referansı


Bir alana lambda referansının nasıl yapıldığını bilmek isterim. Bir yöntem kullanmak istemiyorum çünkü alanım halka açık. Bunun imkansız olduğundan şüpheleniyorum ama açık bir ifade göremiyorum.

class A {
   public final String id;
   ...
}

Map<String, A> f(List<A> l) {
   return l.stream().collect(Collectors.toMap(A::id, Function.identity()));
}

32
2017-12-14 09:25


Menşei


a -> a.id. Neden ilk etapta kamu alanlarını kullanıyorsunuz? - JB Nizet
@JBNizet, veri yapıları olan sınıflardaki kamu final alanlarını severim. Arabirimleri uygulamazlar veya derin hiyerarşileri yoktur. - Daneel S. Yaitskov
@Aditya, bir referans istiyorum çünkü daha kısa. - Daneel S. Yaitskov
@JBNizet, OOAD mutlak gerçek değildir. Uygun oldukları yerlerde araçları uygulamaktan hoşlanırım. Değişmez alanların alıcıları genellikle sadece çizgilerini ve zamanlarını boşa harcarlar. - Daneel S. Yaitskov
Buradan geldi Kod Projesi. Daneel ile aynı fikirdeyim. Son alanlar kod okunabilirliği için herkese açık olabilir. - GGrec


Cevaplar:


Her zaman bir lambda ifadesi kullanabilirsiniz:

return l.stream().collect(Collectors.toMap(a -> a.id, Function.identity()));

Bence "yöntem referansları" bir sebepten dolayı bu şekilde çağrılır ve bu nedenle sadece yöntemler için geçerlidir.


23
2017-12-14 09:27



Gerçek yaşam senaryoları için söz etmeye değer olabilir. x->x.id daha kısa ClassName::id. Sadece iki char veya daha az olan sınıf isimlerini kullanan örnek kodlar için farklı görünebilir. - Holger
@Holger true, ancak daha kısa kod her zaman insanların aradığı şey değildir. Eğer öyleyse, hepimiz sınıflarımızı ve değişkenlerimizi a, b, c, d, ... :) olarak adlandırıyoruz. Bazı kişiler metoda lambda ifadeleri üzerinde sözdizimi referanslar tercih edebilir. - Eran
her zaman insanların aradığı şey değil, bu özel durumda OP, “Bir referans istiyorum, çünkü daha kısa” dedi. - Holger
Bunu herkesin farkına varır mı -> yeni bir yöntem oluşturuldu mu? Mümkün olduğunda yöntem referans sözdizimini tercih etmeliyiz. Tarlalar için hiçbir şey olmadığı çok üzücü. - TWiStErRob


Java'nın buna uygun bir özelliği olduğunu ummaktasınız alan referansları bunun için yaptığı gibi yöntem referansları. Ama durum böyle değil. Metot referansları, belirli bir lambda ifadesi kategorisi için kestirme, ancak alanlar için uygun bir sözdizimi yoktur. JSR-335 Uzman Grubu müzakeresi sırasında saha edebileri araştırıldı (burada bazı referanslar var) http://mail.openjdk.java.net/pipermail/lambda-dev/2011-November/004235.html) ancak Java SE 8'e dahil edilmemiştir.


33
2017-12-14 17:35