Afficher la documentation Java de Java Facultatif

quoi

-Regardez le Javadoc facultatif sur la prémisse de Last Knowledge --Version vue: Java8

public Optional<T> filter(Predicate<? super T> predicate) --filter prend un prédicat avec une implémentation de "test booléen (T t)" comme argument --predicate reçoit une instance de type T et renvoie l'authenticité. À ce moment-là, la classe supérieure de T peut être utilisée pour le jugement au lieu de T. --Exemple spécifique) Lors du filtrage facultatif \ , il n'y a pas de problème avec la méthode qui cible Dog, Animal et Object comme cible de test.

public T orElseGet(Supplier<? extends T> other) --orElseGet prend un fournisseur avec une implémentation de "T get ()" comme argument --other renvoie une instance de type T. À ce moment-là, il peut s'agir d'une classe inférieure de T au lieu de T. --Exemple spécifique) Il n'y a aucun problème avec la méthode qui renvoie SpaceDog lors de l'exécution de orElseGet de Optional \ .

public void ifPresent(Consumer<? super T> consumer) --ifPresent prend un consommateur avec une implémentation de "void accept (T t)" comme argument

public <U> Optional<U> map(Function<? super T,? extends U> mapper) --map prend une fonction avec une implémentation de "U apply (T t)" comme argument --mapper prend une instance de type T comme argument et renvoie une instance de type U. À ce moment-là, la classe supérieure de T peut être utilisée à la place de T, et la classe inférieure de U peut être utilisée à la place de U (une règle qui n'a pas d'importance même si le côté consommation interprète la classe supérieure et le côté production interprète la classe inférieure). --mapper convertit de T (ou supérieur) en U (ou inférieur)

public <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) --flatMap prend une fonction avec une implémentation de "U apply (T t)" comme argument --mapper prend une instance de type T comme argument et renvoie un type facultatif \ . À ce moment-là, la classe supérieure de T peut être utilisée à la place de T.

  • À ce stade, facultatif \ n'est pas facultatif \ <? Étend U> (c'est un problème) --Addition) On m'a dit dans les commentaires que Java 9 est devenu facultatif \ <? Extends U>.
Function<Integer, Optional<SpaceDog>> myConverter = new Function<Integer, Optional<SpaceDog>>() {
    @Override
    public Optional<SpaceDog> apply(Integer t) {
        SpaceDog d = new SpaceDog();
        d.age = t;
        return Optional.of(d);
    }
};

//Erreur de compilation en Java8, OK en Java9
Optional<Dog> optDog = optInt.flatMap(myConverter);

public T orElse(T other) --orElse prend une instance de type T comme argument ―― Est-ce la même chose sans paramètres de type de frontière? ――Est-ce correct parce que vous pouvez utiliser des sous-types s'ils ne sont pas des types génériques?

	Optional<Dog> opt = Optional.of(new Dog());
	Dog d = opt.orElse(new SpaceDog());

--Addition) Pour le problème que orElse ne peut pas être utilisé avec le paramètre de type de limite facultatif, que j'ai reçu dans le commentaire, j'ai pensé à un plan d'amélioration si facultatif avait une telle méthode statique.


	/**
	 *Une méthode pour activer ouElse facultatif avec des variables facultatives de paramètres de type de frontière
	 * 
	 * @Producteur de param optT T(Peut produire une classe inférieure de T)
	 * @param autre type U avec la contrainte de "T ou une sous-classe de T"
	 * @return Return comme type T
	 */
	static <T, U extends T> T orElseEx(Optional<? extends T> optT, U other) { 
		if(optT.isPresent()) {
			return optT.get();
		}
		return other;
	}

//Exemple d'utilisation
Optional<? extends Number> optNum = Optional.empty();
Number num2 = MyOptional.orElseEx(optNum, 0.5);
System.out.println(num2); //0.5

Recommended Posts