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 βοηθά να κάνουμε τον κώδικα πιο ευανάγνωστο και ασφαλή, υποδεικνύοντας ρητά ότι η τιμή μπορεί να απουσιάζει. Δεν πρέπει να χρησιμοποιείται για πεδία κλάσεων ή παραμέτρους μεθόδων αν η απουσία της τιμής αποτελεί εξαίρεση.