Utilisation facultative de la classe

[Nouvelles fonctionnalités] En option JAVA8

Telle est la pratique d'une nouvelle classe de lycée, quand on regarde les gros bonnets d'affaires aiment utiliser le code trouvé dans cette classe, pour étudier un peu en particulier.

  • En option peut être un objet conteneur est nul: il peut contenir la valeur de type T, ou tout simplement pour sauver null.
  • Si la valeur existe méthode renvoie IsPresent () vrai, appelez la méthode get () renvoie l'objet.
  • offre en option de nombreuses applications utiles, donc nous ne détection soient pas explicitement nulle.
  • introduction facultative de la classe une bonne solution à une exception de pointeur NULL.

Analyse Source:

1. La structure du constructeur de la classe et
public final class Optional<T> {
    
    // 这个常量为后面调用 empty() 方法时实例化一个Optional对象做准备
    private static final Optional<?> EMPTY = new Optional<>();

    // 容器内部的值
    private final T value;

    private Optional() {
        this.value = null;
    }

	private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    // ...
}
2. Procédé vide ()

La méthode statique type générique générique T est déterminée par la méthode de l'appel en option, méthode vide () est très simple, comme la fonte constante VIDES en option au même type d'objets, et cette méthode vide () objet retourné en optionLa valeur est nulle.

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

test:

	public static void main(String[] args){
        Optional<Integer> optional = Optional.empty();
        Integer i = optional.get();
        System.out.println(i);
    }

A cette époque, il lancera une exception: java.util.NoSuchElementException: Aucune valeur actuelle.
La raison est que, en option de Optional.empty créé (après) la valeur est nulle, lorsque la méthode get () déterminera si la valeur est nulle, si nulle lorsque le rapport incorrect. Vous pouvez obtenir un oeil à la méthode code source ().

3. get () / isEmpty () / IsPresent () 方法

Relativement simple, mis en place.

	public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

	public boolean isEmpty() {
        return value == null;
    }

	public boolean isPresent() {
        return value != null;
    }
4. de (valeur T) / ofNullable (valeur T) 方法

En regardant le début du code source peut être trouvée, classe facultative possédera deux constructeurs entièrement privatisés, le public sera certainement ouvert des moyens d'accès externe.

	public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

	public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

Voyez la différence: Lorsque ofNullable (T valeur) L création de valeur peut être nulle, de (valeur T) la valeur est nulle .
Voir la nouvelle option <> (valeur) pour le constructeur:

	private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

Continuer à regarder Objects.requireNonNull (valeur) du code source:

	public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

Direct jeter une exception lorsque nulle.

5. IfPresent () / méthode ifPresentOrElse ()

Réponse courte à dire, la consommation accepte classe abstraite contient une méthode. La méthode abstraite pour le traitement des valeurs entrantes, mais aucune valeur de retour.

  • IfPresent (): Si la valeur à traiter, ou non traité.
  • méthode ifPresentOrElse (): Si la valeur qu'il ya à faire un traitement ou un traitement avec emptyAction.
    public void ifPresent(Consumer<? super T> action) {
        if (value != null) {
            action.accept(value);
        }
    }
    
    public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
        if (value != null) {
            action.accept(value);
        } else {
            emptyAction.run();
        }
    }
6. ou () / OrElse () / orElseGet () / orElseThrow () 方法

Cette méthode est utilisée pour évaluer le.

    public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
        Objects.requireNonNull(supplier);
        if (isPresent()) {
            return this;
        } else {
            @SuppressWarnings("unchecked")
            Optional<T> r = (Optional<T>) supplier.get();
            return Objects.requireNonNull(r);
        }
    }
    
	public T orElse(T other) {
        return value != null ? value : other;
    }
    
    public T orElseGet(Supplier<? extends T> supplier) {
        return value != null ? value : supplier.get();
    }

 	public T orElseThrow() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

	public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
7. Procédé de filtration ()

Filtration valeurs sont conformes aux exigences. Si la valeur existe, filtrée.

   public Optional<T> filter(Predicate<? super T> predicate) {
       Objects.requireNonNull(predicate);
       if (!isPresent()) {
           return this;
       } else {
           return predicate.test(value) ? this : empty();
       }
   }
8. Procédé de flux ()

Si la valeur il y a un courant de retour ne contient qu'une seule valeur de valeur.

	public Stream<T> stream() {
        if (!isPresent()) {
            return Stream.empty();
        } else {
            return Stream.of(value);
        }
    }

Basic lecture du code source de savoir comment utiliser. Après encore plus. .

Référence Liens: https://www.jianshu.com/p/dfdc3a0dacca

Publié 33 articles originaux · a gagné les éloges 9 · vues 8695

Je suppose que tu aimes

Origine blog.csdn.net/Serena0814/article/details/97128601
conseillé
Classement