Sobes.tech
Middle

Optional sinfi haqida nima bilasiz?

sobes.tech AI

AIdan javob

Optional<T> - bu konteyner sinfi, u qaysi T turidagi bo'sh bo'lmagan qiymat bo'lishi yoki bo'sh bo'lishi mumkin. U Java 8 ga null ko'rsatkichlar muammosini hal qilish uchun qo'shilgan.

Asosiy metodlar:

  • of(T value): Bo'sh bo'lmagan Optional yaratadi. Qiymat null bo'lsa, NullPointerException tashlaydi.
  • ofNullable(T value): Agar mavjud bo'lsa, bo'sh bo'lmagan Optional yaratadi, aks holda bo'sh Optional.
  • empty(): Bo'sh Optional yaratadi.
  • isPresent(): Agar qiymat mavjud bo'lsa, true, aks holda false.
  • isEmpty(): Agar qiymat mavjud bo'lmasa, true, aks holda false (Java 11 da qo'shilgan).
  • get(): Agar mavjud bo'lsa, qiymatni qaytaradi, aks holda NoSuchElementException tashlaydi.
  • orElse(T other): Agar qiymat mavjud bo'lsa, uni, aks holda other ni qaytaradi.
  • orElseGet(Supplier<? extends T> other): Agar qiymat mavjud bo'lsa, uni, aks holda Supplier ni bajarib, natijasini qaytaradi. Bu orElse(T other) ga nisbatan afzaldir, agar other ning qiymati qimmat bo'lsa.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Agar qiymat mavjud bo'lsa, uni, aks holda exceptionSupplier dan chiqarilgan istisnoni tashlaydi.

NullPointerException dan qochish uchun misol:

// O'rniga
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// Optional dan foydalanish mumkin
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

orElse va orElseGet ni taqqoslash:

// Ikkala chaqiruv ham optionalUser bo'sh bo'lsa, DefaultUser ni qaytaradi
// Ammo `orElse` da, `new DefaultUser()` har doim chaqiriladi,
// hatto optionalUser qiymatga ega bo'lsa ham
User user1 = optionalUser.orElse(new DefaultUser());

// `orElseGet` da, `new DefaultUser()` faqat
// optionalUser bo'sh bo'lsa chaqiriladi
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional kodni o'qilishi oson va xavfsiz qilishga yordam beradi, bu qiymatning mavjud emasligini aniq ko'rsatadi. Uning sinf maydonlari yoki metod parametrlarida ishlatilmasligi kerak, agar qiymatning yo'qligi istisno holat bo'lsa.