-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 \
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.
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