Her şeyden önce her iki yöntemin beyanını kontrol edin.
1) OrElse: Mantık yürütün ve sonucu bağımsız değişken olarak iletin.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: İsteğe bağlı içindeki değer null ise mantığı yürütün
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Yukarıdaki bildirimle ilgili bazı açıklamalar:
“İsteğe bağlı.veyaElse” bağımsız değişkeni, nesnenin isteğe bağlı (null, boş veya değer) değerinden bağımsız olarak her zaman yürütülür. “Optional.orElse” kullanırken daima yukarıda belirtilen noktayı göz önünde bulundurun, aksi takdirde “Optional.orElse” kullanımı aşağıdaki durumda çok riskli olabilir.
Risk-1) Günlüğe Kaydetme Sorunu: orElse içindeki içerik herhangi bir günlük ifadesi içeriyorsa: Bu durumda, bunu her seferinde günlüğe kaydedersiniz.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Risk-2) Performans Sorunu: orElse içindeki içerik zaman yoğun ise: Zaman yoğun içerik herhangi bir G / Ç işlemi DB çağrısı, API çağrısı, dosya okuma olabilir. Bu tür içeriği orElse () içine koyarsak, sistem sonuç olarak kullanılmayan bir kod yürütür.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Risk-3) Yasadışı Durum veya Hata Sorunu: orElse içindeki içerik bir nesne durumunu mutasyona uğratıyorsa: Aynı nesneyi başka bir yerde kullanıyor olabiliriz.
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
O zaman, orElse () ile ne zaman gidebiliriz?
Varsayılan değer sabit bir nesne, enum olduğunda orElse kullanmayı tercih edin. Yukarıdaki tüm durumlarda Optional.orElse () yerine Optional.orElseGet () (yalnızca İsteğe bağlı boş olmayan değer içeriyorsa yürütülür) ile gidebiliriz. Neden?? OrElse'de varsayılan sonuç değerini geçiririz, ancak orElseGet'te Tedarikçi'yi ve Tedarikçi yöntemini yalnızca İsteğe Bağlı'daki değer null olduğunda yürütür.
Buradan önemli çıkarımlar:
- Herhangi bir günlük ifadesi içeriyorsa “Optional.orElse” kullanmayın.
- Yoğun zaman gerektiren bir mantık içeriyorsa “Optional.orElse” kullanmayın.
- Bazı nesne durumlarını değiştiriyorsa “Optional.orElse” kullanmayın.
- Sabit bir enum döndürmek zorunda kalırsak “Optional.orElse” kullanın.
- 1,2 ve 3. noktalarda belirtilen durumlarda “Optional.orElseGet” seçeneğini tercih edin.
Bunu ikinci blogumda ( “Optional.map/Optional.orElse”! = “İf / else” ) açıkladım . Java8'i kodlayıcı olarak değil programcı olarak kullanma
orElseGet
yalnızca değer yoksa tedarikçiyi çağırmasıdır.