2015-08-31 13 views
7

Java 8 presenta la classe Optional.Se non nullo - stile java 8

Prima (Java 7):

Order order = orderBean.getOrder(id); 
if (order != null) { 
    order.setStatus(true); 
    pm.persist(order); 
} else { 
    logger.warning("Order is null"); 
} 

Così su Java 8 stile:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id)); 
optional.ifPresent(s -> { 
    s.setStatus(true); 
    pm.persist(s); 
    //Can we return from method in this place (not from lambda) ??? 
}); 
//So if return take place above, we can avoid if (!optional.isPresent) check 
if (!optional.isPresent) { 
    logger.warning("Order is null"); 
} 

È corretto utilizzare Optional in questo caso? Qualcuno può proporre un modo più conveniente in stile Java 8?

+0

È un metodo inefficiente, ma più pulito, è possibile ottenere l'elemento all'interno di Optional all'interno del blocco try e rilevare l'eccezione NoSuchElementException. – piezol

risposta

6

Sfortunatamente, il metodo ifPresentOrElse si sta cercando will be added solo in JDK-9. Attualmente è possibile scrivere il proprio metodo statico nel progetto:

public static <T> void ifPresentOrElse(Optional<T> optional, 
     Consumer<? super T> action, Runnable emptyAction) { 
    if (optional.isPresent()) { 
     action.accept(optional.get()); 
    } else { 
     emptyAction.run(); 
    } 
} 

E utilizzare in questo modo:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id)); 
ifPresentOrElse(optional, s -> { 
    s.setStatus(true); 
    pm.persist(s); 
},() -> logger.warning("Order is null")); 

In Java-9 sarebbe stato più facile:

optional.ifPresentOrElse(s -> { 
    s.setStatus(true); 
    pm.persist(s); 
},() -> logger.warning("Order is null")); 
+0

Questo sarebbe un miglioramento solo se OP doveva parametrizzare la funzione con la logica di gestione. Per come è, il suo codice è perfetto per il vecchio semplice se-else. –

+0

@MarkoTopolnik, non dico che mi piaccia questa soluzione. In realtà non mi piacciono gli Optionals e raramente li uso. In questo codice sicuramente li eviterei. –

+0

Buona risposta. 'Optional' class = roba facile scritta in modo complicato. Non vedo assolutamente alcun motivo per usare questa classe, hai bisogno di molte più lettere per scrivere il tuo codice in questo modo "moderno" ... – vojta

1

//Can we return from method in this plase (not from lambda) ???

Lambdas non implementa la semantica "ritorno non locale", quindi la risposta è no.

In genere, poiché è necessaria un'azione di effetto collaterale nel caso in cui il valore sia presente e non, un punto di ramificazione nel codice è essenziale — se lo si avvolge in qualche API di fantasia o meno. Inoltre, FP generalmente aiuta a migliorare trasformazioni referenzialmente trasparenti (ad esempio, codice costruito attorno a funzioni pure) e non a effetti collaterali, quindi non troverete molti vantaggi passando attraverso l'API Opzionale.

Problemi correlati