JavaRush /Blog Java /Random-ES /Pausa para el café #97. Tenga cuidado con el método opcio...

Pausa para el café #97. Tenga cuidado con el método opcional de Java. Cómo mostrar y sumar elementos de una lista en Java

Publicado en el grupo Random-ES

Ojo con el método Java Opcional

Fuente: Dev.to Pausa para el café #97.  Tenga cuidado con el método opcional de Java.  Cómo mostrar y sumar elementos de una lista en Java - 1 Según Oracle, un objeto opcional es "un objeto contenedor que puede contener o no un valor no nulo". Opcional apareció por primera vez en Java 8 y ha sido utilizado por el equipo SpringBoot en muchos proyectos. El uso más común de Opcionales es en un proyecto Spring Data. Veamos la interfaz JpaRepository y un método de ejemplo. Por ejemplo, tenemos un objeto Usuario con un Id de tipo entero y tenemos un JpaRepository para él.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Hemos definido un método que busca un usuario por su nombre y devuelve un Opcional para Usuario .

Métodos convenientes opcionales

Opcional se incluye en muchos métodos que nos permiten escribir código limpio y legible. Sin embargo, existe un método que presenta un comportamiento peligrosamente inesperado.

Conoce el método orElse

Según la documentación de Oracle:
public T orElse(T other)
Devuelve el valor si lo hay; en caso contrario, devuelve algo más. Ahora podemos agregar una llamada a un método como parámetro orElse que se ejecutará si el parámetro Opcional está vacío, ¿verdad? Sí, eso es correcto, pero ¿qué pasaría si te dijera que funcionará de todos modos, independientemente de si hay un valor en Opcional o no? Vamos a revisar:
@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";
}
La prueba fue exitosa, pero notarás que la línea " Estoy ejecutando " está impresa en la consola.

¿Por qué está pasando esto?

Java ejecuta un método para proporcionar el valor que se devolverá en el caso de Else .

¡Así que ten cuidado!

Debe tener cuidado si un método dentro de orElse puede tener un efecto secundario porque aún así se ejecutará.

¿Qué hacer?

Puede utilizar el método OrElseGet , que requiere un método de proveedor para ejecutarse si existe Opcional .

Cómo mostrar y sumar elementos de una lista en Java

Fuente: DZone En esta publicación, aprenderá cómo mostrar y resumir la cantidad de elementos de una lista en Java. Mapear elementos de una Lista significa que cada elemento de esa lista se convertirá en un objeto diferente. Sumar elementos de una lista significa que todos los elementos de esa lista se combinarán en un objeto, que no es necesariamente del mismo tipo que el original. Digamos que tenemos una lista de pedidos y cada pedido tiene una lista de productos.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
¿Qué harías si quisieras saber cuánto dinero sale de una lista de pedidos? Para cada pedido, necesitará obtener una lista de los productos presentes en él, y para cada producto en estas listas, necesitará obtener su costo. Después de eso, debes sumar todos estos precios y así es como obtendrás el resultado. Al traducir lo anterior a Mapa / Reducir necesita:
  1. Relaciona cada pedido con una lista de productos.
  2. Muestra el precio de cada producto.
  3. Resuma todos los precios sumándolos.
Entonces hagámoslo en 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. Creamos un flujo de pedidos.
  2. Emparejamos cada pedido con su lista de productos.
  3. Combinamos cada lista de productos con un flujo. Tenga en cuenta que tuvimos que usar flatMap aquí ; de lo contrario, terminaríamos con Stream <Stream <Product>> .
  4. Para cada producto mostramos su precio.
  5. Resumamos todos los precios.
  6. Si la Lista de pedidos está vacía, devuelve cero.
¡Eso es todo! Ahora podemos crear una prueba para asegurarnos de que todo funcione como se esperaba.
@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 puedes ver, Map and Reduce ayuda en los casos en los que necesitas extraer información de una Colección .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION