Optional.stream ()

Esta semana eu aprendi sobre um "novo" recurso interessante do Optional, sobre o qual quero falar neste post. Ele está disponível desde o Java 9, então a novidade é relativa.





Vamos começar com a seguinte sequência para calcular o preço total do pedido:





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



  • Fornece acumulador variável para preço





  • Adicione o preço de cada linha ao preço 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