Facultatif.stream ()

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);                            
}
      
      



  1. orderId



    Optional











  2. flatMap()



    , Optional<BigDecimal>



    ; map()



    Optional<Optional<BigDecimal>>







  3. Optional



    , .





  4. 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". , , .








All Articles