# Optional — Advanced Java

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

> Model a possibly-absent result with Optional as a return type, consume it with map, filter and orElseThrow, and avoid get() and Optional fields.

## Use it as a return type

Return `Optional<T>` from lookups that may find nothing. Consume it with `map`, `filter`, `orElse`, `orElseThrow`, `ifPresent` — not `get()`. Don't use `Optional` for fields or method parameters.

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

## of vs ofNullable, orElse vs orElseGet

`Optional.of(x)` throws if `x` is null; `Optional.ofNullable(x)` allows null. `orElse(expensive())` always evaluates its argument even when the value is present — use `orElseGet(() -> expensive())` for lazy fallback computation.

```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);
```
