Sobes.tech
Middle

Τι ξέρετε για την κλάση Optional;

sobes.tech AI

Απάντηση από AI

Optional<T> είναι μια κλάση κοντέινερ που μπορεί να περιέχει είτε μια μη κενή τιμή τύπου T, είτε να είναι κενή. Προστέθηκε στη Java 8 για την επίλυση του προβλήματος των null δείκτη.

Βασικές μέθοδοι:

  • of(T value): Δημιουργεί ένα Optional με μη κενή τιμή. Ρίχνει NullPointerException αν η τιμή είναι null.
  • ofNullable(T value): Δημιουργεί ένα Optional με μη κενή τιμή αν υπάρχει, ή ένα κενό Optional αν η τιμή είναι null.
  • empty(): Δημιουργεί ένα κενό Optional.
  • isPresent(): Επιστρέφει true αν η τιμή υπάρχει, διαφορετικά false.
  • isEmpty(): Επιστρέφει true αν η τιμή απουσιάζει, διαφορετικά false (προστέθηκε στη Java 11).
  • get(): Επιστρέφει την τιμή αν υπάρχει, διαφορετικά ρίχνει NoSuchElementException.
  • orElse(T other): Επιστρέφει την τιμή αν υπάρχει, διαφορετικά το other.
  • orElseGet(Supplier<? extends T> other): Επιστρέφει την τιμή αν υπάρχει, διαφορετικά εκτελεί και επιστρέφει το αποτέλεσμα του Supplier. Προτιμάται έναντι του orElse(T other) όταν η αρχικοποίηση του other είναι δαπανηρή.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Επιστρέφει την τιμή αν υπάρχει, διαφορετικά ρίχνει την εξαίρεση που παρέχεται από το exceptionSupplier.

Παράδειγμα χρήσης για αποφυγή NullPointerException:

// Αντί
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// Μπορείτε να χρησιμοποιήσετε Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Σύγκριση orElse και orElseGet:

// Και οι δύο κλήσεις θα επιστρέψουν DefaultUser αν το optionalUser είναι κενό
// Αλλά στην περίπτωση του `orElse`, το `new DefaultUser()` θα καλείται πάντα,
// ακόμα και αν το optionalUser περιέχει μια τιμή
User user1 = optionalUser.orElse(new DefaultUser());

// Στην περίπτωση του `orElseGet`, το `new DefaultUser()` θα καλείται μόνο
// αν το optionalUser είναι κενό
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Το Optional βοηθά να κάνουμε τον κώδικα πιο ευανάγνωστο και ασφαλή, υποδεικνύοντας ρητά ότι η τιμή μπορεί να απουσιάζει. Δεν πρέπει να χρησιμοποιείται για πεδία κλάσεων ή παραμέτρους μεθόδων αν η απουσία της τιμής αποτελεί εξαίρεση.