2016-02-11 15 views
14

Optional.ofNullable yöntemiyle şaşırdım.İsteğe bağlı .NULL yap ve yöntem zincirleme

private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) { 
    return Optional.ofNullable(insight.getValues().get(0).getValue()); 
} 

Yanlışlıkla Optional.ofNullable argüman ifadenin içinde herhangi NullPointerExceptions önleyeceği düşünülen: Bir gün bir İsteğe bağlı dönmek gerekiyordu bir fonksiyon yazdım.

Şimdi bunun çok aptalca bir fikir olduğunu biliyorum. Java, önce Optional.ofNullable çağrısına geçmek için argümanları çözmelidir.

Ama bir sorum var. Amacımı başarmanın güzel ve iyi bir yolu var mı? insight.getValues().get(0).getValue() ifadesinden bazı Tamsayı değeri veya null ifadesinden almak istiyorum. Boş değerlerin her biri şu olabilir: insight.getValues() veya insight.getValues().get(0).

Bunu deneme/yakalama bloğuna yerleştirebileceğimi biliyorum, ancak daha zarif bir çözüm olup olmadığını merak ediyorum. Böyle

+0

Sizin durumunuzda 'içgörü' boş. Null iç yöntemlerini kontrol etmek yerine null yöntemlere asla geçmemesi daha iyidir. –

cevap

20

, tek yol Optional.map için zincir aramaları şudur: değer bulunup bulunmadığını

Eğer sağlanan haritalama fonksiyonunu uygulamak ve sonuç null değilse, sonucu açıklayan bir Seçmeli'ye dönün. Aksi takdirde boş bir İsteğe bağlı olarak iade edin. Bu şekilde

, eğer zincir aramaları sağlar eşleyici dönüş null, boş Optional döndürülür.

Optional.ofNullable(insight) 
     .map(i -> i.getValues()) 
     .map(values -> values.get(0)) 
     .map(v -> v.getValue()) 
     .orElse(0); 

orElse(0) için son çağrı herhangi mapper null döndü eğer varsayılan değeri 0 dönmek için izin verir.

2

yetiremediğin #extractFirstValueFrom Guava en checkNotNull() gibi null @Nullable ne de çek ne içermeyen olarak, verilen örnek kod göre, iyi

Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

çalışmak en insightsomething hep olduğunu varsayalım gerekir. Böylece 'un Option'a kaydırılması, NPE ile sonuçlanmayacaktır. Daha sonra,ya da None ya da Some ya da None olabilecek Optional<Integer> sonucuna neden olan dönüşümler zinciri oluşur (her sonuç Optional ile). Eğer null olabilir veya null için her şeyi kontrol etmek istiyor olabilir hiçbir fikrim varsa