From 3c45106d7e77b3f374cad96bddfb4e3222e2b6a9 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 23 Jun 2017 18:28:10 +0300 Subject: [PATCH] + zipMap (1,2) + some Optional methods with only get and isPresent usage --- src/test/java/option/OptionalExample.java | 107 ++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/src/test/java/option/OptionalExample.java b/src/test/java/option/OptionalExample.java index db18993..a3e479a 100644 --- a/src/test/java/option/OptionalExample.java +++ b/src/test/java/option/OptionalExample.java @@ -4,12 +4,42 @@ import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; +import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; import static org.junit.Assert.assertEquals; public class OptionalExample { + public static Optional zipMap1(Optional o1, Optional o2, BiFunction f) { + if (o1.isPresent() && o2.isPresent()) { + return Optional.ofNullable(f.apply(o1.get(), o2.get())); + } else { + return Optional.empty(); + } + } + + public static Optional zipMap2(Optional o1, Optional o2, BiFunction f) { + return o1.flatMap( + t1 -> o2.flatMap( + t2 -> Optional.ofNullable(f.apply(t1, t2)))); + } + + @Test + public void zipTest() { + Optional o1 = Optional.of("hello"); + Optional o2 = Optional.of(404); + + BiFunction f = (s, i) -> "" + s + i; + Optional rOption1 = zipMap1(o1, o2, f); + Optional rOption2 = zipMap2(o1, o2, f); + + assertEquals(rOption1.get(), "hello404"); + assertEquals(rOption2.get(), "hello404"); + } + @Test public void get() { final Optional o1 = Optional.empty(); @@ -50,6 +80,83 @@ public void map() { assertEquals(expected, actual); } + @Test + public void filter() { + Optional o = getOptional(); + Predicate p = String::isEmpty; + Optional expected = o.filter(p); + + Optional actual = (o.isPresent() && p.test(o.get())) + ? o : Optional.empty(); + + assertEquals(expected, actual); + } + + @Test + public void flatMap() { + Optional o = getOptional(); + Function> f = (s) -> Optional.of(s + "hello"); + Optional expected = o.flatMap(f); + + Optional actual = (o.isPresent()) + ? f.apply(o.get()) : Optional.empty(); + + assertEquals(expected, actual); + } + + @Test + public void orElse() { + Optional o = getOptional(); + String str = "hello"; + String expected = o.orElse(str); + + String actual = (o.isPresent()) + ? o.get() : str; + + assertEquals(expected, actual); + } + + @Test + public void orElseGet() { + Optional o = getOptional(); + Supplier s = () -> "hello"; + String expected = o.orElseGet(s); + + String actual = (o.isPresent()) + ? o.get() : s.get(); + + assertEquals(expected, actual); + } + + @Test + public void orElseThrow() { + Optional o = getOptional(); + Supplier s = RuntimeException::new; + + String expected = null; + Exception e1 = new Exception(); + + try { + expected = o.orElseThrow(s); + } catch (RuntimeException e) { + e1 = e; + } + + String actual = null; + try { + if (o.isPresent()) { + actual = o.get(); + } else { + throw s.get(); + } + } catch (RuntimeException e) { + assertEquals(e1.getClass(), e.getClass()); + } + + assertEquals(expected, actual); + + } + private Optional getOptional() { return ThreadLocalRandom.current().nextBoolean() ? Optional.empty()