diff --git a/vavr/src/main/java/io/vavr/control/Option.java b/vavr/src/main/java/io/vavr/control/Option.java index b3a2adac8..0312b4c1f 100644 --- a/vavr/src/main/java/io/vavr/control/Option.java +++ b/vavr/src/main/java/io/vavr/control/Option.java @@ -18,6 +18,7 @@ */ package io.vavr.control; +import io.vavr.CheckedFunction1; import io.vavr.PartialFunction; import io.vavr.Tuple; import io.vavr.Value; @@ -391,6 +392,20 @@ default Option map(Function mapper) { return isEmpty() ? none() : some(mapper.apply(get())); } + + /** + * Converts this to a {@link Try}, then runs the given checked function if this is a {@link Try.Success}, + * passing the result of the current expression to it. + * + * @param The new component type + * @param mapper A checked function + * @return a {@code Try} + * @throws NullPointerException if {@code mapper} is null + */ + default Try mapTry(CheckedFunction1 mapper) { + return toTry().mapTry(mapper); + } + /** * Folds either the {@code None} or the {@code Some} side of the Option value. * diff --git a/vavr/src/test/java/io/vavr/control/OptionTest.java b/vavr/src/test/java/io/vavr/control/OptionTest.java index 4a08f2cef..36145f8a0 100644 --- a/vavr/src/test/java/io/vavr/control/OptionTest.java +++ b/vavr/src/test/java/io/vavr/control/OptionTest.java @@ -25,6 +25,7 @@ import io.vavr.PartialFunction; import io.vavr.Serializables; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.util.*; @@ -361,6 +362,35 @@ public void shouldMapNone() { assertThat(Option. none().map(String::valueOf)).isEqualTo(Option.none()); } + @Nested + class MapTry { + @Test + public void shouldMapTrySome() { + assertThat(Option.of(1).mapTry(String::valueOf)).isEqualTo(Try.success("1")); + } + + @Test + public void shouldMapTryNone() { + Try result = Option.none().mapTry(String::valueOf); + assertThat(result.isFailure()).isTrue(); + assertThat(result.getCause().getClass()).isEqualTo(NoSuchElementException.class); + assertThat(result.getCause().getMessage()).isEqualTo("No value present"); + } + + @Test + public void shouldMapTryCheckedException() { + Try result = Option.of("a") + .mapTry(this::checkedFunction); + assertThat(result.isFailure()).isTrue(); + assertThat(result.getCause().getClass()).isEqualTo(Exception.class); + assertThat(result.getCause().getMessage()).isEqualTo("message"); + } + + private Integer checkedFunction(String string) throws Exception { + throw new Exception("message"); + } + } + // -- flatMap @Test