Maison > Java > javaDidacticiel > le corps du texte

Quelles sont les méthodes facultatives couramment utilisées en Java ?

王林
Libérer: 2023-05-09 11:34:07
avant
2825 Les gens l'ont consulté

Préface

Facultatif en Java est un objet conteneur, qui peut contenir une valeur non nulle ou être vide. Son objectif principal est d'éviter les exceptions de pointeur nul lors de l'écriture de code.

L'utilisation complète de Facultatif dans Java 8 est la suivante :

1 Créez un objet facultatif

Vous pouvez créer un objet contenant des non-. valeurs nulles via la méthode of() Objet facultatif, par exemple :

Optional<String> optional = Optional.of("value");
Copier après la connexion

Vous pouvez également créer un objet facultatif contenant une valeur éventuellement nulle via la méthode ofNullable(), par exemple : #🎜🎜 #

Optional<String> optional = Optional.ofNullable(null);
Copier après la connexion

2. Obtenez l'objet facultatif La valeur de

Vous pouvez obtenir la valeur non nulle dans l'objet facultatif via la méthode get(), par exemple :

String value = optional.get();
Copier après la connexion

Si la valeur de l'objet facultatif est nulle, appelez la méthode get(). NoSuchElementException sera levée. Par conséquent, avant d'appeler la méthode get(), il est préférable d'utiliser la méthode isPresent() pour déterminer si l'objet Optionnel contient une valeur non nulle.

3. Déterminez si l'objet facultatif contient une valeur non nulle

Vous pouvez utiliser la méthode isPresent() pour déterminer si l'objet facultatif contient une valeur non nulle, par exemple :

if (optional.isPresent()) {
    // Optional对象包含非空值
} else {
    // Optional对象为空
}
Copier après la connexion
# 🎜🎜#Vous pouvez également utiliser la méthode ifPresent() pour effectuer certaines opérations lorsque l'objet facultatif contient des valeurs non nulles, par exemple :

optional.ifPresent(value -> System.out.println(value));
Copier après la connexion

4. la valeur ou la valeur par défaut dans l'objet facultatif

#🎜 🎜#Vous pouvez utiliser la méthode orElse() pour obtenir la valeur ou la valeur par défaut dans l'objet facultatif, par exemple :

String value = optional.orElse("default");
Copier après la connexion

If la valeur dans l'objet facultatif est vide, la valeur par défaut spécifiée est renvoyée.

5. Obtenez la valeur dans l'objet facultatif ou lancez une exception

Vous pouvez utiliser la méthode orElseThrow() pour obtenir la valeur dans l'objet facultatif ou lancer une exception, par exemple : #🎜🎜 #
String value = optional.orElseThrow(() -> new RuntimeException("value is null"));
Copier après la connexion

Si la valeur de l'objet facultatif est vide, l'exception spécifiée est levée.

6. Convertissez la valeur de l'objet facultatif

Vous pouvez utiliser la méthode map() pour convertir la valeur de l'objet facultatif en un autre type de valeur, par exemple :

Optional<Integer> optional = Optional.of("123").map(Integer::parseInt);
Copier après la connexion

Si la valeur de l'objet facultatif est vide, un objet facultatif vide est renvoyé.

7. Filtrez la valeur dans l'objet facultatif

Vous pouvez utiliser la méthode filter() pour filtrer la valeur dans l'objet facultatif, par exemple :

Optional<String> optional = Optional.of("value").filter(value -> value.startsWith("v"));
Copier après la connexion

If Facultatif Si la valeur de l'objet ne répond pas aux conditions de filtrage spécifiées, un objet Facultatif vide est renvoyé.

Améliorations de Java 9

Nous avons introduit les fonctionnalités de Java 8. Java 9 ajoute trois méthodes à la classe facultative : or(), ifPresentOrElse() et stream().

La méthode or() est similaire à orElse() et orElseGet(), qui fournissent toutes deux des situations alternatives lorsque l'objet est vide. La valeur de retour de or() est un autre objet facultatif produit par le paramètre Fournisseur.

Si l'objet contient une valeur, l'expression Lambda ne sera pas exécutée :

@Test
public void whenEmptyOptional_thenGetValueFromOr() {
    User result = Optional.ofNullable(user)
      .or( () -> Optional.of(new User("default","1234"))).get();

    assertEquals(result.getEmail(), "default");
}
Copier après la connexion

Dans l'exemple ci-dessus, si la variable utilisateur est nulle, elle renverra un facultatif, qui contient un objet utilisateur dont l'e-mail est "par défaut". La méthode

ifPresentOrElse() nécessite deux paramètres : un Consumer et un Runnable. Si l'objet contient une valeur, l'action du Consommateur sera exécutée, sinon le Runnable sera exécuté.

Si vous souhaitez effectuer une action lorsqu'il y a une valeur, ou simplement savoir si une certaine valeur est définie, alors cette méthode est très utile :

Optional.ofNullable(user).ifPresentOrElse( u -> logger.info("User is:" + u.getEmail()),
  () -> logger.info("User not found"));
Copier après la connexion

Supplément : facultatif controverse Cliquez sur

En fait, il y a encore beaucoup de controverses dans l'industrie sur la question de savoir si Optionnel doit être utilisé. D'une part, Optionnel peut forcer les développeurs à gérer des valeurs nulles, mais d'autre part. , Facultatif est très facile à abuser, en particulier Certains développeurs appellent directement la méthode get() ou ifPresent() après avoir obtenu le Facultatif, ce qui ne résout pratiquement aucun problème et augmente la charge de codage.

Par conséquent, ma suggestion est que si vous ne savez pas si vous devez utiliser Facultatif, ne l'utilisez pas encore.

Voici quelques scénarios de référence pour l'utilisation de Facultatif, comme suit :

Facultatif est généralement utilisé pour renvoyer des valeurs

Facultatif est principalement utilisé pour renvoyer une valeur, son utilisation n'est pas recommandée dans les variables membres ou les paramètres de méthode.

  1. Optional lui-même ne juge pas nul

    N'attribuez jamais null à Facultatif et ne jugez pas si Facultatif lui-même est nul En effet, Facultatif est conçu pour résoudre. null Oui, cela n’aurait aucun sens d’introduire à nouveau null. Cela devrait devenir le consensus de l’industrie.

  2. Les collections n'utilisent pas Facultatif

    Étant donné que les collections ont de meilleures méthodes de traitement telles que Collections.emptyList(), il n'est pas nécessaire d'utiliser Facultatif.

  3. Traitement fonctionnel des valeurs

    Comme vous pouvez le voir dans l'introduction à l'utilisation ci-dessus, Facultatif fournit de nombreuses méthodes de traitement fonctionnel lambda, telles que le filtre, la carte, etc. , ceux-ci sont plus recommandés lors de l'utilisation de Facultatif, car Facultatif peut vous aider à gérer automatiquement les situations de valeurs nulles et à éviter les exceptions NPE.

  4. Acquisition d'attributs multicouches

    J'ai déjà mentionné cet exemple de code Je pense que c'est le scénario dans lequel les avantages de l'utilisation d'Optional sont les plus évidents.

  5. Ne pas renvoyer null est mieux que de renvoyer Facultatif

    Retourner Facultatif à l'appelant forcera l'appelant à gérer la situation nulle, ce qui ajoutera une certaine charge de codage à l'appelant, fonctionne particulièrement avec une grande réutilisabilité.
  6. Mais si l'appelant ne s'attend pas à obtenir null dans la plupart des cas, il doit implémenter une méthode qui renvoie une valeur ou une exception, comme suit :

  7. /**
     * 查询订单,要么返回订单,要么异常
     */
    public Order getOrderByIdOrExcept(Long orderId){
        Order order = orderMapper.getOrderById(orderId);
        if(order == null){
            throw new BizException("根据单号" + orderId + "未查询到订单!");
        }
        return order;
    }
     
    /**
     * 查询订单,值可能为null
     */
    public Optional<Order> getOrderById(Long orderId){
        Order order = orderMapper.getOrderById(orderId);
        return Optional.ofNullable(order);
    }
    Copier après la connexion
    # 🎜 🎜#Étant donné que le code de traitement ultérieur repose sur les données de commande, les données de commande ne peuvent pas être obtenues et le code ne peut pas descendre. Par conséquent, dans la plupart des cas, il est préférable d'utiliser la méthode getOrderByIdOrExcept, qui évite le NPE et augmente la charge de codage. !

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal