Sobes.tech
Middle

Optional классы жөнүндө эмне билесиз?

sobes.tech AI

AIден жооп

Optional<T> — бул контейнер классы, ал T түрүндөгү бош эмес маанини камтышы мүмкүн же бош болушу мүмкүн. Ал null көрсөткүчтөрдүн көйгөйүн чечүү үчүн Java 8ге кошулду.

Негизги ыкмалары:

  • of(T value): Бош эмес мааниси бар Optional түзөт. Эгер мааниси null болсо, NullPointerException чыгарат.
  • ofNullable(T value): Эгер мааниси бар болсо, бош эмес Optional түзөт, эгер null болсо, бош Optional түзөт.
  • 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) караганда артыкчылык.
  • 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 салыштыруу:

// Эки чакырык да optionalUser бош болсо, DefaultUser кайтарат
// Бирок `orElse` учурда, `new DefaultUser()` ар дайым чакырылат,
// анткени optionalUser мааниси болсо да
User user1 = optionalUser.orElse(new DefaultUser());

// `orElseGet` учурда, `new DefaultUser()` гана чакырылат
// эгер optionalUser бош болсо
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional кодду окууну жеңилдетет жана коопсуз кылат, анын мааниси жок болушу мүмкүн экенин так көрсөтөт. Ал класстын талаалары же ыкмалардын параметрлери үчүн колдонулбашы керек, эгер жок мааниси өзгөчө кырдаал болсо.