java.util.Optional class et null et non null

À propos de la classe facultative

Si vous regardez JavaDoc pour une explication détaillée, vous parlez de ce pour quoi vous écrivez ceci, donc une brève explication de la classe Optional sera utile lorsque vous traitez des données dont vous ne savez pas si elles sont nulles ou non.

En fait, cela fait un moment que j'ai déplacé l'environnement de développement vers Java8, mais en fait, je n'ai pas aimé la façon dont je l'ai écrit jusqu'à présent. Cependant, j'ai été surpris de l'utiliser et j'ai regretté de ne pas l'utiliser.

Je voudrais écrire sur une telle classe facultative.

Emplacement JavaDoc

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html

Comment rendre facultatif

Optional.ofNullable("aaa")
Optional.of("aaa")

Au lieu d'en créer un, utilisez ʻof ʻof Nullable pour créer la valeur. La différence entre les deux est le nom, celui qui utilise la valeur Nullable et celui qui n'est pas nul utilise `` of. Étant donné que la valeur de ʻof est vérifiée avec ʻObjects.requireNonNull, passer null entraînera NullPointerException`.

Obtenez la valeur de la classe facultative

Si la méthode d'acquisition doit également être non nulle, la méthode d'acquisition diffère selon qu'elle est nullable ou non.

Premier du cas non complet

get()
orElseThrow(Supplier<? extends X> exceptionSupplier)

Si get est nul, une NullPointerException se produira. ʻOrElseThrow` peut contrôler Exception quand il est nul avec un argument.

Utilisez simplement la méthode que vous souhaitez contrôler l'exception.

Vient ensuite le cas Nullable.

orElse(T other)
orElseGet(Supplier<? extends T> other)

ʻOu Else` est utilisé en passant la valeur lorsque la valeur de Optional est null comme argument (image passant la valeur par défaut). L'argument est utilisé tel quel, donc vous pouvez mettre null ici.

Si la valeur de Optional est null, ʻorElseGet` appelle get du Supplier passé par other et la valeur est retournée. La valeur facultative peut être nullable, mais notez que le fournisseur doit être non nul.

Utilisation de type flux

La classe Optional implémente map`` flatmap pour convertir les valeurs et filter pour filtrer, donc si vous avez une valeur, vous pouvez facilement implémenter ce que vous voulez convertir ou filtrer. S'il n'y a pas de valeur, elle n'est pas traitée en particulier, c'est donc généralement pratique.

La différence entre «map» et «flatmap» est difficile à exprimer avec des mots, je vais donc l'omettre. Fondamentalement, je pense que seule «map» fera quelque chose.

Vérification de l'existence des données

isPresent()
ifPresent(Consumer<? super T> consumer)

ʻIsPresent renvoie true si les données existent, false si elles existent. Puisqu'il y a ʻou Else, il n'est pas nécessaire de le vérifier lors de la récupération de la valeur, mais sans elle, c'est un problème.

ʻIfPresent` est un enfant pratique qui gère ce qu'il faut faire si des données existent en les passant dans une expression lambda. Puisqu'il s'agit d'un type vide, il ne peut être traité que simplement, mais il est difficile de le retirer et de le traiter.

Source d'échantillon faite pour cette fois

Je vais mettre la source que j'ai faite pour vérifier l'opération pour faire cet article cette fois. Ce n'est pas un gros problème, mais j'espère que cela aide.

package javasample;

import java.util.Optional;

public class Main {
	public static void main(String[] args) {
		Optional<String> str = Optional.ofNullable("aaa");
		Optional<String> str2 = Optional.ofNullable("");
		Optional<String> str3 = Optional.ofNullable(null);

		Optional<String> str4 = Optional.of("aaa");
		Optional<String> str5 = Optional.of("");
		// Optional<String> str6 = Optional.of(null);
		
		Optional<Text> text = Optional.ofNullable(null);
		Optional<Text> text2 = Optional.ofNullable(new Text());

		System.out.println(str.get());
		System.out.println(str2.get());
		System.out.println(str3.orElse(null));
		System.out.println("");

		System.out.println(str4.get());
		System.out.println(str5.get());
		// System.out.println(str6.get());
		System.out.println("");

		System.out.println(text.orElse(null));
		System.out.println(text.map(Text::getText).orElse("ccc"));
		System.out.println(text.flatMap(text3 -> Optional.of(text3.text)).orElse(null));
		System.out.println(text2.get());
		System.out.println(text2.map(Text::getText2).get());
		System.out.println(text2.flatMap(text3 -> Optional.of(text3.text)).orElse(null));
		System.out.println("");
		
		str.ifPresent(text3 -> System.out.println(text3 + text3));
		str2.ifPresent(text3 -> System.out.println(text3 + text3));
		str3.ifPresent(text3 -> System.out.println(text3 + text3));
    }
	
	public static class Text {
		private String text = "aaa";
		private String text2 = "bbb";
		
		public String getText() {
			return text;
		}
		
		public String getText2() {
			return text2;
		}
	}
}

Recommended Posts

java.util.Optional class et null et non null
Classe et modèle
abstract (classe abstraite) et interface (interface)
Classe et instant part2
Classe principale Spring-Boot introuvable
Définition et instanciation de classe Java
Fichier de classe HttpServletRequest introuvable
Différence entre classe et instance
Relation entre le package et la classe
Différence entre la méthode d'instance et la méthode de classe
types et idéaux nuls et facultatifs et réalité
Différence entre interface et classe abstraite
Obtenir TypeElement et TypeMirror à partir de la classe
Ce n'est pas "else if" mais "else" et "if"
Différence entre la variable d'instance et la variable de classe
Classe StringBuffer et StringBuilder en Java
Notes d'étude de classe interne et de style lambda
À propos de la différence entre la classe Applet et la classe JApplet
Argument Mockito null Le test d'hypothèse a spécifié le type et n'a pas retourné