2017-04-04 18 views
5
public ValueA map(ValueB valueB, Date date) { 
    Optional<ValueC> valueCOpt = find(valueB); 
    if (valueCOpt.isPresent()) { 
     ValueC valueC = valueCOpt.get(); 
     // call many getters on valueC and do a lot of logic with it. 
     return map(/*some parameters*/); 
    } 
    return null; 
} 

Bu oldukça çirkin görünüyor. Opsiyonların avantajı tamamen buradan gider. Bunu, get yerine map veya flatMap kullanmayı tercih ettim. BenOptional.get ve Optional.isPresent kullanımı nasıl engellenir?

valueCOpt.map(ValueC::getFieldA) 

ile

valueC.getFieldA() 

gibi her alıcı Burada bazı ortak ya da en iyi uygulamaları biliyor musunuz yerini Ama eğer gerçekten bir fayda nedir? Bir istisna

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC)) 
     .orElse(null); 

OrElse (gerekirse

+3

https://www.youtube.com/watch?v=Ej0sss6cq14 – Eugene

cevap

7

Sen isteğe bağlı boş değilse kilit noktası haritalama işlevi yalnızca değerlendirilir ki, aksi takdirde sonuç opsiyonel boş kalır

public ValueA map(ValueB valueB, Date date) { 
    return find(valueB) 
     .map(valueC -> { 
      // call many getters on valueC and do a lot of logic with it. 
      return map(/*some parameters*/); 
     }) 
     .orElse(null); 
} 

kullanabilirsiniz . İsteğe bağlı boşsa, orElse(null), null'u döndürecektir.

+1

ve yine ... oldukça hızlı. – Eugene

+1

Bu hoş. Bir başka refactoring ise boş değil, boş bir opsiyonel olarak iade edilebilir. Sonra yazabilirim: find (valueB) .map (valueC -> { // valueC'de birçok alıcıya çağrı yapın ve onunla çok mantık yapın. dönüş haritası (/ * bazı parametreler * /);}); Yani: Hayır '.orElse (null)' gereklidir. – Chris311

+0

@ Chris311 Eğer harita (/ * bazı parametreler * /);}) 'İsteğe bağlı olarak döndürdüğünüzde' find (valueB) .flatMap (valueC -> map (...)) '; –

3

İhtiyacın Eğer varsayılan bir değer gerektiğinde bu durumda onun null yılında, kullanılan), harita daha sonra bir OrElse() veya orElseThrow() 'dir

İlgili konular