İsteğe bağlı iyi bir şey, kullanır mısın? | Güç Projesi

Yazar | BoCong-Den

Sorumlu Editör | Yu Yan

Mühür haritası | Oriental IC'den indirilen CSDN

Üretildi | CSDN (ID: CSDNnews)

Önüne yaz

Java 8'den tanıtılan ilginç bir özellik, İsteğe Bağlı sınıftır. İsteğe bağlı sınıfın çözdüğü ana sorun, her Java programcısının çok iyi bildiği bir istisna olan kötü şöhretli PointerException'dır (PointerException). İsteğe Bağlı'nın tam yolu, kodda zincir programlama stilini benimseyebilen if (obj! =) {} Paradigma kodunu önlemek için kullanılan java.util.Optional'dır. Ayrıca, İsteğe bağlı olarak sağlanan filtre yöntemi, nesnenin koşulları karşılayıp karşılamadığını belirlemek için kullanılabilir ve yalnızca koşullar karşılandığında geri döner Harita yöntemi, nesneyi döndürmeden önce nesnenin özelliklerini değiştirebilir.

Opsiyonel Kullanımı

Esasen, İsteğe bağlı, isteğe bağlı değerler içeren bir sarmalayıcı sınıfıdır; bu, İsteğe Bağlı sınıfın nesneler içerebileceği veya boş olabileceği anlamına gelir. İsteğe Bağlı'nın Java'da işlevsel programlamaya yönelik güçlü bir adım olduğunu ve bunu paradigma içinde gerçekleştirmeye yardımcı olduğunu bilmemiz gerekir. Ancak İsteğe Bağlı'nın anlamı açıkça bundan daha fazlasıdır. Nesne yöntemlerine veya özelliklerine erişim için yapılan herhangi bir çağrının PointerException'a neden olabileceğini biliyoruz.Burada, açıklamak için basit bir örnek vereceğim

1String sonucu = test.getName.getTime.getNum.getAnswer;

Yukarıdaki kodda, herhangi bir istisnanın tetiklenmediğinden emin olmamız gerekirse, erişmeden önce her bir değeri açıkça kontrol etmeliyiz, yani test eşdeğerinin doğru olup olmadığını belirlemek için başka bir değer kullanmalıyız, bu kolayca ayrıntılı hale gelebilir , Bakımı zor. Bu süreci basitleştirmek için Google'ın ünlü Guava projesi, İsteğe Bağlı sınıfını tanıttı. Guava, boş değerleri kontrol ederek kod kirliliğini önler ve programcıları daha temiz kod yazmaya teşvik eder. İsteğe bağlı aslında bir kaptır: T türünün değerini tutabilir veya tutabilir. İsteğe bağlı olarak, boş değerleri açıkça kontrol etmemiz için birçok yararlı yöntem sağlar.

İsteğe bağlı kurucu

İsteğe bağlı oluşturmanın üç yolu: Optional.of (obj), Optional.ofable (obj) ve explicit Optional.empty

  • Optional.of (obj): Nesnede iletilen değerin bir değer olamayacağını gerektirir, aksi takdirde doğrudan bir PointerException bildirir.

  • Optional.ofable (obj): Akıllı ve toleranslı bir şekilde İsteğe bağlı bir örnek oluşturur. Reddetmeyenler, teslim ederseniz Optional.empty alacaksınız, aksi takdirde Optional.of (obj) 'i arayacaksınız.

  • Optional.empty: boş bir İsteğe bağlı nesne döndürür

İsteğe bağlı ortak işlevler

  • Değer olmayanlar için bir İsteğe Bağlı oluşturun. Yöntemi, fabrika yöntemi aracılığıyla İsteğe Bağlı bir sınıf oluşturur. Bir nesne yaratılırken aktarılan parametrelerin olamayacağına dikkat edilmelidir. Gelen parametre ise, PointerException atılır. Bu nedenle sık kullanılmamaktadır.

  • ofable: Belirtilen değer için bir İsteğe Bağlı oluşturun. Belirtilen değer ise boş bir İsteğe bağlı döndürülür.

  • isPresent: Değer varsa doğru, aksi takdirde yanlış döndürür.

  • ifPresent: İsteğe bağlı örneğin bir değeri varsa, tüketici çağrılır, aksi takdirde hiçbir işlem yapılmaz

  • get: İsteğe bağlı bir değer varsa, onu döndür, aksi takdirde NoSuchElementException at. Bu nedenle sık kullanılmamaktadır.

  • orElse: Bir değer varsa döndürülür, aksi takdirde belirtilen diğer değeri döndürür.

  • orElseGet: orElseGet, orElse yöntemine benzer, fark varsayılan değerdedir. OrElse yöntemi, gelen dizeyi varsayılan değer olarak kullanır ve orElseGet yöntemi, varsayılan değeri oluşturmak için Tedarikçi arabiriminin uygulanmasını kabul edebilir.

  • orElseThrow: Bir değer varsa, onu iade edin, aksi takdirde tedarikçi arayüzü tarafından oluşturulan bir istisna atın.

  • filtre: Bir değer varsa ve onaylama koşulu karşılanırsa, değeri içeren bir İsteğe bağlı döndürülür, aksi takdirde boş bir İsteğe Bağlı döndürülür.

  • map: Bir değer varsa, onu çalıştırın ve dönüş değerini almak için eşleme işlevini çağırın. Dönüş değeri değilse, eşlemenin dönüş değerini harita yönteminin dönüş değeri olarak içeren bir İsteğe Bağlı oluşturun, aksi takdirde boş bir İsteğe Bağlı döndürür.

  • flatMap: Bir değer varsa, isteğe bağlı bir dönüş değeri döndürmek için eşleme işlevini çalıştırın, aksi takdirde boş bir İsteğe Bağlı döndürür.

Opsiyonel nasıl kullanılır

Ne zaman ve nasıl kullanılacağına karar vermek için İsteğe Bağlı'yı kullanırken dikkate alınması gereken birkaç nokta vardır. Önemli olan nokta, İsteğe Bağlı'nın Seri Hale Getirilebilir olmamasıdır. Bu nedenle sınıfın bir alanı olarak kullanılmamalıdır. Serileştirmeniz gereken nesne İsteğe Bağlı değerler içeriyorsa, Jackson kitaplığı İsteğe Bağlı Nesneler gibi davranmayı destekler. Başka bir deyişle, Jackson boş nesneleri olarak değerlendirecek ve değerli nesneler onun değerini karşılık gelen alanın değeri olarak ele alacaktır. Bu özellik jackson-module-java8 projesinde yer almaktadır. Opsiyonel esas olarak bir dönüş türü olarak kullanılır.Bu türden bir örnek aldıktan sonra, bir değeri varsa bu değeri alabilir, aksi takdirde bazı alternatif davranışlar gerçekleştirebilirsiniz. İsteğe bağlı sınıf, akıcı bir API oluşturmak için İsteğe Bağlı olarak dönen akışlarla veya diğer yöntemlerle birleştirilebilir. Bir örneğe bakalım, şu şekilde kod yazmak için İsteğe Bağlı kullanmıyoruz:

1public String getName (Kullanıcı kullanıcısı) { 2 if (user ==) { 3 "Bilinmeyen" döndürür; 4} aksi takdirde kullanıcı.adı döndürür; 5}

Ardından, yukarıdaki kodu değiştirelim, değiştirmek için İsteğe Bağlı'yı kullanın, önce aşağıdaki gibi sorunsuz bir zincir API'si sağlamayan ancak oldukça karmaşık olan İsteğe Bağlı kötüye kullanım örneğini verelim:

1public String getName (Kullanıcı kullanıcısı) { 2 Opsiyonel < Kullanıcı > u = İsteğe bağlı.ofable (kullanıcı); 3 if (! U.isPresent) { 4 "Bilinmeyen" döndürür; 5} aksi takdirde u.get.name döndürür; 6}

Bu yeniden yazma sadece özlü değildir, aynı zamanda işlem ilk kodla aynıdır. Orijinal user == yerine isPresent yöntemini kullanmaktan başka bir şey değildir. Bu yeniden yazma Opsiyonel'in doğru kullanımı değil, tekrar yazalım.

1public String getName (Kullanıcı kullanıcısı) { 2 iade Opsiyonel.ofable (kullanıcı) 3.. Harita (u- > Adın) 4 .orElse ("Bilinmeyen"); 5}

Bu, İsteğe bağlı olarak kullanılacak doğru duruştur. Daha sonra bu tür bir düşünceye göre, katman katman yargılarda bulunmak yerine gönül rahatlığıyla zincirleme çağrılar yapabiliriz. Elbette, kodu aşağıdaki gibi alıcı yöntemiyle (Kullanıcının bir alıcı yöntemine sahip olması koşuluyla) daha da azaltabiliriz.

1String sonucu = Optional.ofable (kullanıcı) 2. .flatMap (Kullanıcı :: getAddress) 3. .flatMap (Adres :: getCountry) 4. .map (Ülke :: getIsocode) 5 .orElse ("varsayılan");

İsteğe bağlı en iyi uygulamalar

Öncelikle Opsiyonel ne zaman kullanılacağını kısaca anlatmak için bir resim çekelim:

  • Örneğin var olup olmadığını kontrol etmek için Optional.isPresent kullanmaktan kaçının (yukarıdaki örnekte bahsedilmiştir), çünkü bu yöntem! = Obj'den farklı değildir, bu yüzden onu kullanmanın bir anlamı yoktur.

  • Örnek nesnesini almak için Optional.get kullanmaktan kaçının, çünkü kullanmadan önce örneğin var olup olmadığını kontrol etmek için Optional.isPresent kullanmanız gerekir, aksi takdirde bir NoSuchElementException olacaktır. Sonuçlarınızı almak için orElse, orElseGet veyaElseThrow kullanın

Burada açıklamak istediğim şey, orElse (...) 'nin acil bir hesaplama olduğudur, bu da aşağıdaki kod gibi bir anlama gelir:

1 Opsiyonel < Köpek > OptionalDog = fetchOptionalDog; 2optionalDog 3. .map (this :: printUserAndReturnUser) 4. .orElse (this :: printVoidAndReturnUser)

Değer mevcutsa, iki yöntem yürütülür, değer yoksa, yalnızca son yöntem çalıştırılır. Bu durumların üstesinden gelmek için tedarikçiyi parametre olarak alan ve tembel hesaplanan orElseGet yöntemini kullanabiliriz.

  • Bir sınıfın veya örneğin bir özniteliği olarak İsteğe Bağlı'yı kullanmaktan kaçının, ancak döndürülen örnek nesnesini dönüş değerinde sarmak için kullanılmalıdır.

  • 3 ile aynı nedenden ötürü isteğe bağlı bir yöntem parametresi olarak kullanmaktan kaçının.

  • İsteğe bağlı olarak atama

  • Yalnızca sonuç belirsiz olduğunda, dönüş türü olarak İsteğe Bağlı'yı kullanın. Bir anlamda, İsteğe bağlı olarak kullanılabilecek tek iyi yer burasıdır. Resmi Java dili: Amacımız, kütüphane yönteminin geri dönüş türü için sınırlı bir mekanizma sağlamaktır, bu da "sonuç yok" ifadesinin açık bir yolunu gerektirir ve böyle bir yöntemin kullanılması kesinlikle hatalara neden olabilir.

  • Harita ve filtre kullanmaktan korkmayın, SLA-p olarak adlandırılan takip etmeye değer bazı genel geliştirme uygulamaları vardır: Tek Katmanlı Soyutlama'nın ilk başkenti. Aşağıda, yeniden düzenlenmek için yeniden düzenlenmesi gereken kod yer almaktadır

Örnek bir

1Dog köpek = fetchSomeVaraible; 2String dogString = dogToString (köpek); 3public String dogToString (Dog dog) { 4 if (köpek ==) { 5 return "KÖPEKin adı:" + köpek.getName; 6} başka { 7 dönüş "CAT"; 8} 9} 10 // Yukarıdaki kod, aşağıdaki koda yeniden düzenlenmiştir 11 Opsiyonel < Köpek > dog = fetchDogIfExists; 12String dogsName = köpek 13.map (this :: convertToDog) 14 .orElseGet (this :: convertToCat) 1516public void convertToDog (Dog dog) { 17 return "KÖPEKin adı:" + köpek.getName; 18} 1920public void convertToCat { 21 dönüş "CAT"; yirmi iki}

Örnek iki

1Dog köpek = fetchDog; 2if (isteğe bağlıDog! = İsteğe bağlıDog.isBigDog) { 3 doBlaBlaBla (isteğe bağlıDog); 4} 5 // Yukarıdaki kod, aşağıdaki koda yeniden düzenlenmiştir 6 Opsiyonel < Köpek > OptionalDog = fetchOptionalDog; 7optionalDog 8. .filter (Dog :: isBigDog) 9. ifPresent (this :: doBlaBlaBla)
  • Zincir yöntemi için isteğe bağlı kullanmayın. İsteğe bağlı kullanırken dikkat edilmesi gereken bir şey, zincirleme yöntemlerin cazibesidir. Oluşturucu deseni gibi yöntemleri zincirlediğimizde, işler güzel görünebilir. Ancak her zaman daha okunaklı anlamına gelmez. Öyleyse bunu yapma, performans için kötü ve okunabilirlik için kötü. Mümkün olduğunca kaynak kullanmaktan kaçınmalıyız.

1Dog köpek = fetchDog; 2if (isteğe bağlıDog! = İsteğe bağlıDog.isBigDog) { 3 doBlaBlaBla (isteğe bağlıDog); 4} 5 // Yukarıdaki kod, aşağıdaki koda yeniden düzenlenmiştir 6 Opsiyonel < Köpek > OptionalDog = fetchOptionalDog; 7optionalDog 8. .filter (Dog :: isBigDog) 9. ifPresent (this :: doBlaBlaBla)
  • Tüm ifadeleri tek satırlı bir lambda yapın. Bu daha genel bir kural ve bence akışlara da uygulanması gerekiyor. Ancak bu makale isteğe bağlıdır. İsteğe Bağlı'yı kullanmanın önemli noktası, denklemin sol tarafının da sağ taraf kadar önemli olduğunu hatırlamaktır. İşte bir örnek

1 Opsiyonel 2. .ofable (bazı Değişken) 3. .map (değişken- > { 4 dene { 5 someREpozitory.findById (variable.getIdOfOtherObject) döndür; 6} catch (IOException e) { 7 LOGGER.error (e); 8 yeni RuntimeException (e) atar; 9}}) 10. filtre (değişken- > { 11 if (variable.getSomeField1! =) { 12 true döndür; 13} else if (variable.getSomeField2! =) { 14 yanlış döndür; 15} başka { 16 true döndür; 17} 18}) 19.map ((değişken- > { 20 dene { 21 jsonMapper.toJson (değişken); 22} catch (IOException e) { 23 LOGGER.error (e); 24 yeni RuntimeException (e) atar; 25}})) 26 .map (String :: trim) 27 .veyaElseThrow (- > new RuntimeException ("bir şeyler korkunç derecede ters gitti."))

Yukarıdaki ayrıntılı kod bloğu bir yöntemle değiştirilebilir:

1 Opsiyonel 2. .ofable (bazı Değişken) 3. .map (this :: findOtherObject) 4. filtre (this :: isThisOtherObjectStale) 5. .map (this :: convertToJson) 6.map (String :: trim) 7. veyaElseThrow (- > new RuntimeException ("bir şey korkunç şekilde ters gitti."));

Orijinal bağlantı:

https://blog.csdn.net/DBC_121/article/details/104984093

CSDN VIP üyelik kartının ek faydaları var! ! !

Yüzlerce e-kitap artık okumak için ücretsiz! Site genelindeki kaynakları indirin ve binlerce kursu ücretsiz izleyin. Öğrenme için günde sadece 0,8 yuan.

Herhangi bir performans göstergesi sınırların dışında veya APP çökmelerine neden olur, youku genel performans bir numara testi
önceki
Tsinghua ekibinin kendi geliştirdiği AI çerçevesi PK Pytorch, kim daha iyi? | Makalenin sonu avantajları
Sonraki
Programcılar kayboluyor
Python'un göz kamaştırıcı operasyonu: koşullu ifadeler yazmanın yedi yolu
Görüşme tamamlandı! 2020 sürüngen mülakat soruları koleksiyonu
Doğal dil modeli algoritması çok mu dağınık? Yerel birleşik AI açık kaynak çerçevesi burada
5 günde 12 araca el konuldu! Rizhao Kamu Güvenliği Trafik Polisi "Sokak Sokağı" Yasadışı Eylemlerini Sıkı Bir Şekilde Araştırıyor |
Tai'an: Paidaiyue Bölgesindeki ikinci grup CPPCC organları "dört ilerlemeyi" ilerletiyor
İl Kırsal Canlandırma Hizmet Ekibi: En güzel ayak izini Rushan'da bırakın
Hong Kong Basel sizi "bulut süpürme ürünleri" çevrimiçi ticaret moduna mı yoksa "baharı" karşılamaya mı davet ediyor?
Shenzhen Yima Yolu, birkaç aydır belediye mühendisliği hasarından dolayı tamir edilmedi.
Son LPR'de faiz indirimi beklentileri düştü! Mortgage'in LPR'ye dönüştürülmesi için aylık ödeme artacak mı yoksa azalacak mı?
Namebase, GitHub geliştiricilerine para verdi, bu yeni bir yatırım mı yoksa bir yatırım dolandırıcılığı mı?
Mühendisler teknolojiden yönetime nasıl dönüşür?
To Top