Une Java8 nouvelles fonctionnalités: Classe en option

null mot-clé facultatif ne remplace pas, mais plutôt pour le jugement nul fournit une implémentation plus élégante

NullPointException peut dire que tous les développeurs Java a rencontré une exception, bien que java de la conception initiale pour les programmeurs en essayant de sortir du pointeur Oliver, mais le pointeur est bien réel, et le concepteur de Java ne peut faire pointer devenir plus simple, facile à utiliser, mais ne peut pas être complètement supprimée, de sorte que les mots - clés que nous avons vu dans le langage java par jour null.

exception de pointeur NULL est une exception d'exécution, pour ce type d'exception s'il n'y a pas de stratégie de traitement claire, la meilleure pratique est de permettre au programme d'accrocher au début, mais dans de nombreuses scènes, pas le développeur a pas de stratégie de traitement spécifique, mais simplement pas au courant de l'existence d'une exception de pointeur nULL. Lorsqu'une exception se produit, la stratégie de traitement est simple, ajoutez une instruction if pour déterminer où il y a peu, mais ces stratégies d'adaptation font de notre programme de plus en plus de jugement nul, nous savons bien la programmation, le code devrait être autorisé à essayer de paraître mot - clé moins nul, offert java8 Optionalcours à réduire NullPointException, mais aussi d' améliorer l'apparence du code. Mais nous devons d'abord être clair que ce  n'est pas pour nullun mot clé de remplacement, mais pour le jugement nul fournit une implémentation plus élégante, évitant ainsi NullPointException .

A. sentiments intuitifs

Supposons que nous devons retourner la longueur d'une chaîne, si vous ne l' utilisez pas des outils tiers, nous avons besoin d'appeler la str.length()méthode:

if (NULL == str) {// pointeur null est déterminée 
    return 0; 
} 
str.length de retour ();

En option Si la classe, mis en œuvre comme suit:

retour Optional.ofNullable (str) .map (String :: longueur) .orElse (0);

En option le code relativement plus concis, lorsque le code est grand, il est facile d'oublier le jugement nul, mais l'utilisation des classes en option évitera ces problèmes.

II. Utilisation de base

1. Création d'objets

Créer un objet null

En option <String> optStr = Optional.empty ();

Le code exemple ci - dessus appelle la empty()méthode crée un vide de Optional<String>type d'objet.

Créer des objets: NOT NULL
fournit une méthode optionnelle of()objet non null utilisé pour créer, cette méthode nécessite les paramètres entrants ne peuvent pas être vide, sinon jeter NullPointException, des exemples sont les suivants:

En option <String> optStr = Optional.of (str); // si str est nulle quand jeté NullPointException

Créer un objet: être NULL
si les paramètres entrants ne peuvent pas déterminer si la possibilité de la présence d'une valeur nulle, vous pouvez utiliser en option ofNullable()créer une méthode d'objet, si le paramètre est nul, un objet vide est créé. Les exemples sont les suivants:

En option <String> optStr = Optional.ofNullable (str); // Si str est null, créer un objet vide

2. Diffusion

Le streaming est java8 nous a apporté une nouvelle fonctionnalité poids lourd, Fixons des opérations pour devenir plus concise et efficace, le prochain article sur les nouvelles fonctionnalités java8, traitera de la perte d'une explication complète. Ici, en option fournit également deux traitements de la perte de base: la cartographie et le filtrage.

Pour le démontrer, nous avons conçu une Userclasse, comme suit:

/ ** 
 * @author: zhenchao.Wang 24/09/2016 15:36:56 
 * / 
public class utilisateur { 

    / **用户编号* / 
    id longtemps privé; 

    privé nom de chaîne; 

    âge private int; 

    privé en option <long> téléphone; 

    privé en option <String> E - mail; 

    Utilisateur public (String name, age int) { 
        this.name = nom; 
        this.age = âge; 
    } 

    //省略setter和getter 
}

Téléphone et E-mail n'est pas un homme d'être là, donc nous utilisons la définition en option.

Carte: la carte et flatMap
opération de mise en correspondance pour convertir une entrée en une autre forme de sortie, tel que l'exemple précédent, nous avons la chaîne d'entrée, et la sortie est la longueur de la chaîne, ceci est une indication, la méthode que nous utilisons map()pour atteint. Supposons que nous voulons obtenir le nom d'une personne, nous pouvons obtenir les résultats suivants:

String name = Optional.ofNullable (utilisateur) .map (User :: getName) .orElse ( "sans nom");

De sorte que lorsque le paramètre utilisateur n'est pas vide lorsque son nom est retourné, sinon no name , comme je l' espère , nous obtenons téléphone ou par e - mail par la manière ci - dessus, la façon d'utiliser cette procédure ne fonctionne pas, parce que le retour après la carte est facultative, nous appelons cela en option appelée imbrication, nous devons une fois afin d'obtenir les résultats que nous voulons sur la carte:

à long téléphone = optUser.map (User :: getPhone) .map (en option :: get) .orElse (-1L);

En fait, cette fois, une meilleure façon est d'utiliser flatMap, étape pour obtenir les résultats que nous voulons:

à long téléphone = optUser.flatMap (User :: getPhone) .orElse (-1L);

flapMap chaque flux peut être renvoyé par la méthode aplatie en un courant, en particulier un article en continu élaborer consacré plus faible.

Filtre: Fliter
filiter, comme son nom l' indique est une opération de filtrage, on peut passer à l'opération de filtration en tant que paramètre à la méthode, afin d'atteindre l'objectif consistant à filtrer, nous voulons filtre , on a ajouté plus de 18 adultes, peut être obtenue comme suit:

optUser.filter (u -> u.getAge ()> = 18) .ifPresent (u -> System.out.println ( "Adulte:" + u));

3. Le comportement par défaut

Le comportement par défaut est lorsque l'opération condition facultative ne se contente pas effectuée, par exemple, dans l'exemple ci - dessus , nous utilisons orElse()est une action par défaut pour objet en option pour effectuer une action spécifique est vide, bien sûr, il y a une action par défaut lorsque la condition l'opération effectuée en présence d'un objet.

GET ()
Habituez pour obtenir la valeur d'une variable, mais lorsque la variable n'existe pas sera jeté NoSuchElementException, donc je ne sais si la variable existe, l' utilisation est déconseillée

OrElse (T autre)
lorsque variable facultative satisfait la condition prédéterminée, OrElse est effectuée, par exemple lorsque la str avant est nul, 0 est retourné.

orElseGet (<? étend X> Fournisseur expectionSupplier)
Si les conditions ne sont pas établies, vous devez effectuer une logique relativement complexe, plutôt que de simplement revenir à l' opération, vous pouvez utiliser orElseGet atteint:

à long téléphone = optUser.map (User :: getPhone) .map ( en option :: get) .orElseGet (() -> { 
    // faire quelque chose ici 
    revenir -1L; 
});

orElseThrow (fournisseur <? étend X> expectionSupplier)
similaire à la méthode renvoie get () une exception lorsque toutes les conditions ne sont pas remplies, mais ici , nous pouvons préciser le type d'exception retourné.

IfPresent (consommation <? super T> )
réalisé paramètre de fonctionnement passé lorsque la condition est satisfaite.

III. Précautions

En option est une classe finale ne met pas en œuvre une interface, donc quand nous utilisons la définition de la classe d'emballage de classe d'attributs, si nous définissons les classes ont des besoins de sérialisation, afin de ne pas mettre en œuvre l'interface Serializable en option, cette fois-ci pour effectuer sérialisation opération sera un problème:

la classe utilisateur les outils du Serializable {public 

    / numéro d'utilisateur ** * / 
    Privé Long ID, 

    nom de chaîne privée, 

    privé Âge int, 

    privé en option Le <Long> Téléphone; // ne peut pas être sérialisé 

    privé en option <String> E - mail // ne peut pas être sérialisé

Mais nous pouvons utiliser la politique de remplacement suivante:

téléphone à long privé; 

En option publique <Long> getPhone () { 
    retour Optional.ofNullable (this.phone); 
}

Il semble en option lorsque la conception n'a pas jugé à utiliser comme une sorte de champ -

Publié un article original · louange gagné 1 · vues 71

Je suppose que tu aimes

Origine blog.csdn.net/f_u_c_k_le/article/details/105278616
conseillé
Classement