# Getting Started

{% hint style="success" %}
The best way to think of Results is as a super-powered version of Java's Optionals.
{% endhint %}

`Result` builds upon the familiar concept of `Optional`, enhancing it with the ability to represent both success and failure states.

{% tabs %}
{% tab title="Why Results over Optionals?" %}
`Optional` class is useful for representing values that might be present or absent, eliminating the need for null checks. However, Optionals fall short when it comes to error handling because they do not convey why a value is lacking. `Result` addresses this limitation by encapsulating both successful values and failure reasons, offering a more expressive way to reason about what went wrong.
{% endtab %}

{% tab title="Result API" %}
Results provide the same methods as Optionals, plus additional ones to handle failure states effectively.

| [`Optional`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html)                                                                        | [`Result`](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html)                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [isPresent](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#isPresent\(\))                                                           | [hasSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#hasSuccess--)                                                                  |
| [isEmpty](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#isEmpty\(\))                                                               | [hasFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#hasFailure--)                                                                  |
| [get](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#get\(\))                                                                       | [getSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#getSuccess--)                                                                  |
|                                                                                                                                                                           | [getFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#getFailure--)                                                                  |
| [orElse](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#orElse\(java.lang.Object\))                                                 | [orElse](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#orElse-S-)                                                                         |
| [orElseGet](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#orElseGet\(java.util.function.Supplier\))                                | [orElseMap](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#orElseMap-java.util.function.Function-)                                         |
| [stream](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#stream\(\))                                                                 | [streamSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#streamSuccess--)                                                            |
|                                                                                                                                                                           | [streamFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#streamFailure--)                                                            |
| [ifPresent](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#ifPresent\(java.util.function.Consumer\))                                | [ifSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#ifSuccess-java.util.function.Consumer-)                                         |
|                                                                                                                                                                           | [ifFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#ifFailure-java.util.function.Consumer-)                                         |
| [ifPresentOrElse](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#ifPresentOrElse\(java.util.function.Consumer,java.lang.Runnable\)) | [ifSuccessOrElse](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#ifSuccessOrElse-java.util.function.Consumer-java.util.function.Consumer-) |
| [filter](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#filter\(java.util.function.Predicate\))                                     | [filter](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#filter-java.util.function.Predicate-java.util.function.Function-)                  |
|                                                                                                                                                                           | [recover](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#recover-java.util.function.Predicate-java.util.function.Function-)                |
| [map](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#map\(java.util.function.Function\))                                            | [mapSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#mapSuccess-java.util.function.Function-)                                       |
|                                                                                                                                                                           | [mapFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#mapFailure-java.util.function.Function-)                                       |
|                                                                                                                                                                           | [map](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#map-java.util.function.Function-java.util.function.Function-)                         |
| [flatMap](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#flatMap\(java.util.function.Function\))                                    | [flatMapSuccess](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#flatMapSuccess-java.util.function.Function-)                               |
| [or](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Optional.html#or\(java.util.function.Supplier\))                                              | [flatMapFailure](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#flatMapFailure-java.util.function.Function-)                               |
|                                                                                                                                                                           | [flatMap](https://javadoc.io/doc/com.leakyabstractions/result-api/latest/com/leakyabstractions/result/api/Result.html#flatMap-java.util.function.Function-java.util.function.Function-)                 |
| {% endtab %}                                                                                                                                                              |                                                                                                                                                                                                         |
| {% endtabs %}                                                                                                                                                             |                                                                                                                                                                                                         |

![No need to return null or throw an exception: just return a failed result.](https://137539276-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MfavUYGNGvzkCicVu3-%2Fuploads%2Fgit-blob-e6747b416fb83f690b09aa1c141a56df4b1052f3%2Fgetting-started.png?alt=media)

By leveraging Results, you can unleash a powerful tool for error handling that goes beyond the capabilities of traditional Optionals, leading to more robust and maintainable Java code.
