Asıl hata, hala daha usule uygun şekilde düşündüğün. Bu bir kişi olarak sizi eleştirmek anlamına gelmez, sadece bir gözlemdir. Daha işlevsel terimlerle düşünmek zaman ve pratikle gelir ve bu nedenle bu yöntemler sizin için en açık ve doğru şeylere benziyor. İkincil küçük hata ise, İsteğe Bağlı yönteminizi yönteminizde oluşturmaktır. İsteğe Bağlı, bir şeyin bir değer getirebileceğini veya vermeyeceğini belgelemeye yardımcı olmak içindir. Hiçbir şey alamayabilirsin.
Bu, size makul derecede makul görünen mükemmel okunaklı kodlar yazmanıza neden oldu, ancak aldığınız ve isPresent olan aşağılık ikiz baştan çıkarıcıları tarafından baştan çıktınız.
Tabii ki hızlı bir şekilde soru, "Neden Hazır ve Oraya Gidiyor?"
Buradaki birçok kişinin özlediği şey şudur: isPresent (), insanlar tarafından gemide yazılan yeni kod için yapılmış olan ve faydalı lambdaların ne kadar işe yaradığı ve işlevsel olanı sevenler için yapılan bir şey değildir.
Ancak, bize birkaç (iki) iyi, harika, çekici (?) Yarar sağlar:
- Yeni özellikleri kullanmak için eski kod geçişini kolaylaştırır.
- İsteğe bağlı öğrenme eğrilerini kolaylaştırır.
İlki oldukça basittir.
Buna benzeyen bir API'niz olduğunu hayal edin:
public interface SnickersCounter {
/**
* Provides a proper count of how many snickers have been consumed in total.
*/
public SnickersCount howManySnickersHaveBeenEaten();
/**
* returns the last snickers eaten.<br>
* If no snickers have been eaten null is returned for contrived reasons.
*/
public Snickers lastConsumedSnickers();
}
Ve bunu kullanarak eski bir sınıfınız vardı (boşlukları doldurun):
Snickers lastSnickers = snickersCounter.lastConsumedSnickers();
if(null == lastSnickers) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers);
}
Emin olmak için kesin bir örnek. Ama burada benimle ayı.
Java 8 şimdi başlattı ve gemiye girmek için çabalıyoruz. Dolayısıyla yaptığımız şeylerden biri, eski arayüzümüzü İsteğe Bağlı olan bir şeyle değiştirmek istediğimizdir. Neden? Çünkü başkası nezaketle bahsetmişken:
Bu, bir şeyin null olabileceği ya da olmama tahminini ortadan kaldırır.
Bu, başkaları tarafından çoktan işaret edilmiştir. Ama şimdi bir sorunumuz var. (Masum bir yöntemde alt + F7'ye çarptığım için afedersiniz), bu yöntemin 46 mükemmel şekilde işin iyi yapıldığını söyleyen eski kodda çağrıldığı bir yer olduğunu hayal edin. Şimdi bunların hepsini güncellemelisiniz.
BU, Present'in parladığı yerdir.
Çünkü şimdi: Snickers lastSnickers = snickersCounter.lastConsumedSnickers (); if (null == lastSnickers) {yeni NoS BusesnickersException () at; } else {consumer.giveDiabetes (lastSnickers); }
dönüşür:
Optional<Snickers> lastSnickers = snickersCounter.lastConsumedSnickers();
if(!lastSnickers.isPresent()) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers.get());
}
Ve bu yeni küçük çocuğa verebileceğiniz basit bir değişiklik: O yararlı bir şeyler yapabilir ve aynı zamanda kod tabanını da keşfedecektir. kazan-kazan. Sonuçta, bu stile benzer bir şey oldukça yaygın. Ve şimdi, lambda veya başka bir şey kullanmak için kodu yeniden yazmak zorunda değilsiniz. (Bu özel durumda önemsiz olurdu, ancak okuyucunun alıştırması yapmanın zor olacağı örnekleri düşünerek bırakıyorum.)
Bunun, sizin yaptığınız yolun, esasen pahalı yeniden yazma yapmadan eski kodlarla başa çıkmanın bir yolu olduğu anlamına geldiğine dikkat edin. Peki ya yeni kod?
Durumunda, sadece bir şeyi basmak istediğin yerde, yapardın:
. SnickersCounter.lastConsumedSnickers () ifPresent (System.out :: println);
Hangi oldukça basit ve tamamen açık. O zaman yavaşça yüzeye sıçrayan nokta, get () ve isPresent () için kullanım durumları olduğudur. Daha fazla düşünmeden yeni türleri kullanmak için var olan kodu mekanik olarak değiştirmenize izin vermek için oradalar. Yaptıklarınız bu nedenle aşağıdaki şekillerde yanlış yönlendirilmişlerdir:
- Siz null dönebilecek bir yöntem çağırıyorsunuz. Doğru fikir, yöntemin null değerini döndürdüğüdür.
- Bu isteğe bağlı ile baş etmek için miras bandajı yöntemleri içeren lezzetli yeni yöntemleri kullanmak yerine eski bandaj yöntemlerini kullanıyorsunuz.
Optional'ı basit bir sıfır güvenlik kontrolü olarak kullanmak istiyorsanız, yapmanız gereken şey şudur:
new Optional.ofNullable(employeeServive.getEmployee())
.map(Employee::getId)
.ifPresent(System.out::println);
Tabii ki, bu iyi görünümlü versiyonu gibi görünüyor:
employeeService.getEmployee()
.map(Employee::getId)
.ifPresent(System.out::println);
Bu arada, hiçbir zorunluluk olmasa da, okuma başına daha kolay olması için işlem başına yeni bir satır kullanmanızı öneririm. Okuması ve anlaşılması kolay, haftanın herhangi bir günü özlülük yener.
Elbette, yapmaya çalıştığımız her şeyi anlamanın kolay olduğu çok basit bir örnek. Gerçek hayatta her zaman bu kadar basit değildir. Ancak, bu örnekte, ifade ettiğimiz şeyin niyetlerimizin ne kadar olduğuna dikkat edin. Çalışanı almak, kimliğini almak ve mümkünse yazdırmak istiyoruz. Bu, Optional ile ikinci büyük galibiyet. Daha net bir kod oluşturmamızı sağlar. Ayrıca bir harita üzerinde besleyebilmeniz için bir sürü şey yapan bir yöntem yapmak gibi şeyler yapmanın genel olarak iyi bir fikir olduğunu düşünüyorum.