JavaRush /Blog Java /Random-FR /Pause café #97. Soyez prudent avec la méthode Java Facult...

Pause café #97. Soyez prudent avec la méthode Java Facultative. Comment afficher et additionner les éléments d'une liste en Java

Publié dans le groupe Random-FR

Soyez prudent avec la méthode Java facultative

Source : Dev.to Pause café #97.  Soyez prudent avec la méthode Java Facultative.  Comment afficher et additionner les éléments d'une liste en Java - 1 Selon Oracle, un objet facultatif est « un objet conteneur qui peut ou non contenir une valeur non nulle ». Facultatif est apparu pour la première fois dans Java 8 et a été utilisé par l'équipe SpringBoot dans de nombreux projets. L'utilisation la plus courante des options est dans un projet Spring Data. Regardons l'interface JpaRepository et un exemple de méthode. Par exemple, nous avons un objet User avec un identifiant de type entier et nous avons un JpaRepository pour cela.
@Repository
public interface IUserRepo extends JpaRepository<User, Integer>
{
    Optional<User> findByUserName(String userName);
}
Nous avons défini une méthode qui recherche un utilisateur par son nom et renvoie un Facultatif pour User .

Méthodes pratiques en option

Facultatif est inclus dans de nombreuses méthodes qui nous permettent d'écrire du code propre et lisible. Cependant, il existe une méthode dont le comportement est dangereusement inattendu.

Découvrez la méthode orElse

D'après la documentation Oracle :
public T orElse(T other)
Renvoie la valeur s'il y en a une, sinon renvoie autre chose. Nous pouvons maintenant ajouter un appel de méthode en tant que paramètre orElse qui s'exécutera si le paramètre facultatif est vide, n'est-ce pas ? Oui, c'est exact, mais que se passerait-il si je vous disais que cela fonctionnerait de toute façon, qu'il y ait ou non une valeur dans Facultatif . Allons vérifier:
@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";
}
Le test a réussi, mais vous remarquerez que la ligne « Je cours » est imprimée sur la console.

Pourquoi cela arrive-t-il?

Java exécute une méthode pour fournir la valeur qui sera renvoyée dans le cas de Else .

Donc sois prudent!

Vous devez faire attention si une méthode dans orElse peut avoir un effet secondaire car elle sera toujours exécutée.

Ce qu'il faut faire?

Vous pouvez utiliser la méthode OrElseGet , qui utilise une méthode fournisseur pour s'exécuter si Facultatif existe .

Comment afficher et additionner les éléments d'une liste en Java

Source : DZone Dans cet article, vous apprendrez comment afficher et résumer le nombre d'éléments d'une liste en Java. Mapper des éléments d'une liste signifie que chaque élément de cette liste sera converti en un objet différent. La somme des éléments d'une liste signifie que tous les éléments de cette liste seront combinés en un seul objet, qui n'est pas nécessairement du même type que celui d'origine. Disons que nous avons une liste de commandes et que chaque commande comporte une liste de produits.
record Order(String customer, List<Product> products) {
}

record Product(String brand, String modelName, BigDecimal price) {
}
Que feriez-vous si vous vouliez savoir combien d’argent provient d’une liste de commandes ? Pour chaque commande, vous devrez obtenir une liste des produits qui y sont présents, et pour chaque produit de ces listes, vous devrez connaître son coût. Après cela, vous devez résumer tous ces prix, et c'est ainsi que vous obtenez le résultat. Lors de la traduction de ce qui précède en Map / Reduce , vous avez besoin de :
  1. Associez chaque commande à une liste de produits.
  2. Affichez le prix de chaque produit.
  3. Résumez tous les prix en les additionnant.
Alors faisons-le 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. Nous créons un flux de commandes.
  2. Nous associons chaque commande à sa liste de produits.
  3. Nous associons chaque liste de produits à un flux. Notez que nous avons dû utiliser flatMap ici , sinon nous nous retrouverions avec Stream <Stream <Product>> .
  4. Pour chaque produit nous affichons son prix.
  5. Résumons tous les prix.
  6. Si la liste de commandes est vide, renvoyez zéro.
C'est tout! Nous pouvons maintenant créer un test pour nous assurer que tout fonctionne comme prévu.
@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))
    );
}
Comme vous pouvez le constater, Map and Reduction est utile dans les cas où vous devez extraire des informations d' une Collection .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION