From b918d1bfc16fb2dbfdbfeaf9aec13a83669b59fc Mon Sep 17 00:00:00 2001 From: Yegor Date: Mon, 26 Jun 2017 15:20:58 +0300 Subject: [PATCH 1/3] Optional methods with get() and ifPresent() --- src/test/java/option/Option.java | 13 +++ src/test/java/option/OptionalExample.java | 100 +++++++++++++++++++++- 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/src/test/java/option/Option.java b/src/test/java/option/Option.java index cb2da39..bfbdf9e 100644 --- a/src/test/java/option/Option.java +++ b/src/test/java/option/Option.java @@ -4,6 +4,7 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.Supplier; // https://github.com/java8-course/option public abstract class Option { @@ -54,6 +55,11 @@ public boolean isEmpty() { public T orElse(T t) { return t; } + + @Override + public T orElseGet(Supplier s) { + return s.get(); + } } private static class Some extends Option { @@ -93,6 +99,11 @@ public boolean isEmpty() { public T orElse(T t) { return value; } + + @Override + public T orElseGet(Supplier s) { + return value; + } } @@ -108,6 +119,8 @@ public T orElse(T t) { public abstract boolean isEmpty(); // orElse public abstract T orElse(T t); +// orElseGet + public abstract T orElseGet(Supplier s); } diff --git a/src/test/java/option/OptionalExample.java b/src/test/java/option/OptionalExample.java index db18993..b79e5d0 100644 --- a/src/test/java/option/OptionalExample.java +++ b/src/test/java/option/OptionalExample.java @@ -2,9 +2,12 @@ import org.junit.Test; +import java.util.Objects; import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; import static org.junit.Assert.assertEquals; @@ -50,9 +53,102 @@ public void map() { assertEquals(expected, actual); } + @Test + public void orElse() { + final Optional o1 = getOptional(); + + final String orElse = "t"; + + final String expected = o1.orElse("t"); + + final String actual; + if (o1.isPresent()) { + actual = o1.get(); + } else { + actual = orElse; + } + } + + @Test + public void orElseGet() { + final Optional o1 = getOptional(); + + final Supplier getChar = () -> "t"; + + final String expected = o1.orElseGet(getChar); + + final String actual; + if (o1.isPresent()) { + actual = o1.get(); + } else { + actual = "t"; + } + + assertEquals(expected, actual); + } + + @Test + public void filter() { + final Optional o1 = getOptional(); + + final Predicate isNull = Objects::isNull; + + final Optional expected = o1.filter(isNull); + + final Optional actual; + if (o1.isPresent() && isNull.test(o1.get())) { + actual = Optional.of(o1.get()); + } else { + actual = Optional.empty(); + } + + assertEquals(expected, actual); + } + + @Test + public void flatMap() { + final Optional o1 = getOptional(); + + final Function> big = s -> Optional.of(s.toUpperCase()); + + final Optional expected = o1.flatMap(big); + + final Optional actual; + if (o1.isPresent()) { + actual = big.apply(o1.get()); + } else { + actual = Optional.empty(); + } + + assertEquals(expected, actual); + } + + @Test + public void orElseThrow() { + final Optional o1 = getOptional(); + + final Supplier exception = Exception::new; + + try { + System.out.println(o1.orElseThrow(exception)); + } catch (Exception e) { + System.out.println("no value"); + } + + try { + if (o1.isPresent()) { + System.out.println(o1.get()); + } else { + throw exception.get(); + } + } catch (Exception e) { + System.out.println("no value"); + } + } + private Optional getOptional() { return ThreadLocalRandom.current().nextBoolean() - ? Optional.empty() - : Optional.of("abc"); + ? Optional.empty() + : Optional.of("abc"); } } From 5aaaf96d6c6fd81684a4f9054d8f65375db1d914 Mon Sep 17 00:00:00 2001 From: Yegor Date: Mon, 26 Jun 2017 15:25:07 +0300 Subject: [PATCH 2/3] +zipMap with isPresent() and get() --- src/test/java/option/OptionalExample.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/option/OptionalExample.java b/src/test/java/option/OptionalExample.java index b79e5d0..4b2b62a 100644 --- a/src/test/java/option/OptionalExample.java +++ b/src/test/java/option/OptionalExample.java @@ -5,6 +5,7 @@ import java.util.Objects; 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; @@ -13,6 +14,26 @@ public class OptionalExample { + public static Optional zipMap(Optional t1, Optional t2, BiFunction f) { + if (t1.isPresent() && t2.isPresent()){ + return Optional.of(f.apply(t1.get(), t2.get())); + } else { + return Optional.empty(); + } +// //no mutable +// //no is present and get +// //map and flatmap + } + + @Test + public void zipMap() { + Optional first = Optional.of(1); + Optional second = Optional.of("a"); + + Optional result = zipMap(first, second, (i, s) -> i + s); + assertEquals(result.get(), "1a"); + } + @Test public void get() { final Optional o1 = Optional.empty(); From da8638616fa86aa111b7874824c7330684706319 Mon Sep 17 00:00:00 2001 From: Yegor Date: Mon, 26 Jun 2017 15:26:08 +0300 Subject: [PATCH 3/3] +zipMap without isPresent() and get() --- src/test/java/option/OptionalExample.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/option/OptionalExample.java b/src/test/java/option/OptionalExample.java index 4b2b62a..f68ae29 100644 --- a/src/test/java/option/OptionalExample.java +++ b/src/test/java/option/OptionalExample.java @@ -15,11 +15,7 @@ public class OptionalExample { public static Optional zipMap(Optional t1, Optional t2, BiFunction f) { - if (t1.isPresent() && t2.isPresent()){ - return Optional.of(f.apply(t1.get(), t2.get())); - } else { - return Optional.empty(); - } + return t1.flatMap(opt1 -> t2.map(opt2 -> f.apply(opt1, opt2))); // //no mutable // //no is present and get // //map and flatmap