JavaRush /Blogue Java /Random-PT /Pausa para café #97. Tenha cuidado com o método Java opci...

Pausa para café #97. Tenha cuidado com o método Java opcional. Como exibir e somar elementos de uma lista em Java

Publicado no grupo Random-PT

Tenha cuidado com o método Java Opcional

Fonte: Dev.to Pausa para café #97.  Tenha cuidado com o método Java opcional.  Como exibir e somar elementos de uma lista em Java - 1 De acordo com a Oracle, um objeto Opcional é “um objeto contêiner que pode ou não conter um valor não nulo”. Opcional apareceu pela primeira vez no Java 8 e tem sido usado pela equipe SpringBoot em muitos projetos. O uso mais comum de Opcionais é em um projeto Spring Data. Vejamos a interface JpaRepository e um método de exemplo. Por exemplo, temos um objeto User com um tipo inteiro Id e temos um JpaRepository para ele.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Definimos um método que procura um usuário pelo nome e retorna um Opcional para User .

Métodos convenientes opcionais

Opcional está incluído em muitos métodos que nos permitem escrever código limpo e legível. No entanto, existe um método com comportamento perigosamente inesperado.

Conheça o método orElse

De acordo com a documentação da Oracle:
public T orElse(T other)
Retorne o valor se houver, caso contrário, retorne outra coisa. Agora podemos adicionar uma chamada de método como um parâmetro orElse que será executado se o parâmetro Opcional estiver vazio, certo? Sim, está correto, mas e se eu lhe dissesse que funcionará de qualquer maneira, independentemente de haver um valor em Opcional ou não. Vamos checar:
@Test
public void orElseTest()
{
    String result = Optional.of("hello").orElse(someMethod());
    assertThat(result).isEqualTo("hello");
}
private String someMethod()
{
    System.out.println("I am running !!");
    return "hola";
}
O teste foi bem-sucedido, mas você notará que a linha “ Estou executando ” está impressa no console.

Por que isso está acontecendo?

Java executa um método para fornecer o valor que será retornado no caso de Else .

Por isso tem cuidado!

Você deve ter cuidado se um método dentro de orElse puder ter um efeito colateral porque ele ainda será executado.

O que fazer?

Você pode usar o método OrElseGet , que usa um método fornecedor para ser executado se Opcional existir .

Como exibir e somar elementos de uma lista em Java

Fonte: DZone Neste post, você aprenderá como exibir e resumir o número de elementos de uma lista em Java. Mapear itens de uma lista significa que cada item dessa lista será convertido em um objeto diferente. Somar os elementos de uma lista significa que todos os elementos dessa lista serão combinados em um objeto, que não é necessariamente do mesmo tipo do original. Digamos que temos uma lista de pedidos e cada pedido possui uma lista de produtos.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
O que você faria se quisesse saber quanto dinheiro vinha de uma lista de pedidos? Para cada pedido, você precisará obter uma lista dos produtos nele presentes, e para cada produto dessas listas, você precisará obter o seu custo. Depois disso, você precisa somar todos esses preços, e é assim que você obtém o resultado. Ao traduzir o acima para Map / Reduce você precisa:
  1. Combine cada pedido com uma lista de produtos.
  2. Exiba o preço de cada produto.
  3. Some todos os preços somando-os.
Então vamos fazer isso em Java:
public class OrderMapReducer {
    public BigDecimal getTotal(List<Order> orders) {
        return orders.stream() // 1
                     .map(Order::products) // 2
                     .flatMap(List::stream) // 3
                     .map(Product::price) // 4
                     .reduce(BigDecimal::add) // 5
                     .orElse(BigDecimal.ZERO); // 6
    }
}
  1. Criamos um fluxo de pedidos.
  2. Combinamos cada pedido com sua lista de produtos.
  3. Combinamos cada lista de produtos com um fluxo. Observe que tivemos que usar flatMap aqui , caso contrário, terminaríamos com Stream <Stream <Product>> .
  4. Para cada produto exibimos seu preço.
  5. Vamos resumir todos os preços.
  6. Se a Lista de Pedidos estiver vazia, retorne zero.
Isso é tudo! Agora podemos criar um teste para ter certeza de que tudo está funcionando conforme o esperado.
@Test
void getTotalPrice() {
    List<Order> orders = createOrders();
    OrderMapReducer orderMapReducer = new OrderMapReducer();
    assertEquals(new BigDecimal(17800), orderMapReducer.getTotal(orders));
}

private static List<Order> createOrders() {
    var strato = new Product("Fender", "Stratocaster", new BigDecimal(3500));
    var sg = new Product("Gibson", "SG", new BigDecimal(4800));
    var lesPaul = new Product("Gibson", "Les Paul", new BigDecimal(4500));
    var rr = new Product("Jackson", "RR", new BigDecimal(5000));

    return List.of(
            new Order("David Gilmour", List.of(strato)),
            new Order("Toni Iommi", List.of(sg)),
            new Order("Randy Rhoads", List.of(lesPaul, rr))
    );
}
Como você pode ver, Map and Reduce ajuda nos casos em que você precisa extrair informações de uma Collection .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION