Cette semaine, j'ai découvert une "nouvelle" fonctionnalité intéressante d'Optional dont je veux parler dans cet article. Il est disponible depuis Java 9, donc la nouveauté est relative.
Commençons par la séquence suivante pour calculer le prix total de la commande :
public BigDecimal getOrderPrice(Long orderId) {
List<OrderLine> lines = orderRepository.findByOrderId(orderId);
BigDecimal price = BigDecimal.ZERO;
for (OrderLine line : lines) {
price = price.add(line.getPrice());
}
return price;
}
Fournir un accumulateur variable pour le prix
Ajouter le prix de chaque ligne au prix total
, , . :
public BigDecimal getOrderPrice(Long orderId) {
List<OrderLine> lines = orderRepository.findByOrderId(orderId);
return lines.stream()
.map(OrderLine::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
orderId
: null
.
null
, - :
public BigDecimal getOrderPrice(Long orderId) {
if (orderId == null) {
throw new IllegalArgumentException("Order ID cannot be null");
}
List<OrderLine> lines = orderRepository.findByOrderId(orderId);
return lines.stream()
.map(OrderLine::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
, orderId
Optional. Optional:
public BigDecimal getOrderPrice(Long orderId) {
return Optional.ofNullable(orderId)
.map(orderRepository::findByOrderId)
.flatMap(lines -> {
BigDecimal sum = lines.stream()
.map(OrderLine::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return Optional.of(sum);
}).orElse(BigDecimal.ZERO);
}
orderId
Optional
flatMap()
,Optional<BigDecimal>
;map()
Optional<Optional<BigDecimal>>
Optional
, .
Optional
,0
Optional
! , .
, Optional
stream()
( Java 9). :
public BigDecimal getOrderPrice(Long orderId) {
return Optional.ofNullable(orderId)
.stream()
.map(orderRepository::findByOrderId)
.flatMap(Collection::stream)
.map(OrderLine::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
:
, . , , , .
"Java Developer. Basic". , , .