# Optional — एडवांस्ड जावा

Source: https://www.geekswithgeeks.com/hi/advanced-java/adv-optional

> संभवतः-अनुपस्थित परिणाम को रिटर्न टाइप के रूप में Optional से मॉडल करें, map, filter व orElseThrow से उपयोग करें, और get() तथा Optional फ़ील्ड से बचें।

## इसे रिटर्न टाइप की तरह उपयोग करें

जो लुकअप कुछ न पाए वहाँ `Optional<T>` लौटाएँ। `map`, `orElse`, `orElseThrow` से उपयोग करें, `get()` से नहीं।

```java
String city = repo.findUser(id)
    .map(User::address)
    .map(Address::city)
    .orElse("unknown");
```

## of बनाम ofNullable, orElse बनाम orElseGet

`Optional.of(x)` null पर एक्सेप्शन देता है; `Optional.ofNullable(x)` null स्वीकारता है। `orElse(expensive())` मान मौजूद होने पर भी आर्ग्युमेंट का मूल्यांकन कर देता है — आलसी फ़ॉलबैक के लिए `orElseGet(() -> expensive())` उपयोग करें।

```java
// Bad: buildDefault() runs even when user is present
User u = repo.find(id).orElse(buildDefault());

// Good: buildDefault() runs only when needed
User u2 = repo.find(id).orElseGet(this::buildDefault);
```
