2017-01-05 49 views
5

Böyle bir şey yapmaya çalışıyorum: ifPresent hükümsüz kabul sahiptir parametre olarak Tüketici fonksiyonel bir arayüz alır, çünküJava 8 opsiyonel: ifPresent dönüş nesnesi orElseThrow istisna

private String getStringIfObjectIsPresent(Optional<Object> object){ 
     object.ifPresent(() ->{ 
      String result = "result"; 
      //some logic with result and return it 
      return result; 
     }).orElseThrow(MyCustomException::new); 
    } 

Bu işe yaramaz (T t). Herhangi bir değeri iade edemez. Bunu yapmanın başka yolu var mı?

+0

olası çift [Optional.ifPresent doğru kullanımı()] (http://stackoverflow.com/questions/24228279/proper-usage-of-optional-ifpresent) –

cevap

7

Ben değerdir emin olduktan sonra eşleme tercih ediyorum mevcut

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    Object ob = object.orElseThrow(MyCustomException::new); 
    // do your mapping with ob 
    String result = your-map-function(ob); 
    return result; 
} 

ya da bir astar

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return your-map-function(object.orElseThrow(MyCustomException::new)); 
} 
arasında
+0

Aslında 'İsteğe Bağlı.map ', nesnenin geçmiş eşleme işlevini çağırmadan önce kullanılabilir olup olmadığını kontrol eder. Ama en azından 1 koşulu ('value! = Null') bu şekilde yedeklersiniz. – Roland

4

Bunun yerine map işlevini kullanın. İsteğe bağlı olarak değeri dönüştürür. Bunun gibi

:

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return object.map(() -> { 
     String result = "result"; 
     //some logic with result and return it 
     return result; 
    }).orElseThrow(MyCustomException::new); 
} 
11

Aslında ne arıyorsunuz geçerli: Optional.map. Eğer yapabilirsen doğrusu Optional geçen ihmal ediyorum

object.map(o -> "result" /* or your function */) 
     .orElseThrow(MyCustomException::new); 

: gibi Kodunuz sonra görünecektir. Sonunda burada Optional'u kullanarak hiçbir şey kazanamazsınız. Biraz başka varyantı: Zaten nedeniyle başka bir çağrıya Optional -Nesne varsa

public String getString(Object yourObject) { 
    if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices 
    throw new MyCustomException(); 
    } 
    String result = ... 
    // your string mapping function 
    return result; 
} 

, hala tek bir nedenle yerine isPresent vs., sen map kullanılan yöntem kullanmak öneriyoruz, ben Daha okunabilir (açıkça öznel bir karar ;-)) bulun. Burada

2

İki seçenek:

map ile ifPresent değiştirin ve kullanımı Function yerine Consumer ait

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return object 
      .map(obj -> { 
       String result = "result"; 
       //some logic with result and return it 
       return result; 
      }) 
      .orElseThrow(MyCustomException::new); 
} 

Kullanım isPresent:

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    if (object.isPresent()) { 
     String result = "result"; 
     //some logic with result and return it 
     return result; 
    } else { 
     throw new MyCustomException(); 
    } 
}