Skip to content

Commit d83dca0

Browse files
Semen PopugaevSemen Popugaev
Semen Popugaev
authored and
Semen Popugaev
committed
fix
1 parent e4f0ea6 commit d83dca0

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-1
lines changed

src/test/java/option/Option.java

+94-1
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,110 @@
44
import java.util.function.Consumer;
55
import java.util.function.Function;
66
import java.util.function.Predicate;
7-
import java.util.function.Supplier;
87

98
// https://github.com/java8-course/option
109
public abstract class Option<T> {
1110

11+
private static final None EMPTY = new None();
12+
13+
public static <T> Option<T> empty() {
14+
return EMPTY;
15+
}
16+
17+
public static <T> Option<T> of(T t) {
18+
return new Some<T>(t);
19+
}
20+
21+
public static <T> Option<T> ofNullable(T t) {
22+
return null == t ? empty() : of(t);
23+
}
24+
25+
private Option() {}
26+
27+
private static class None<T> extends Option<T> {
28+
29+
@Override
30+
public Option<T> filter(Predicate<T> p) {
31+
return empty();
32+
}
33+
34+
@Override
35+
public <R> Option<R> map(Function<T, R> f) {
36+
return empty();
37+
}
38+
39+
@Override
40+
public <R> Option<R> flatMap(Function<T, Option<R>> f) {
41+
return empty();
42+
}
43+
44+
@Override
45+
public void forEach(Consumer<T> c) {
46+
}
47+
48+
@Override
49+
public boolean isEmpty() {
50+
return true;
51+
}
52+
53+
@Override
54+
public T orElse(T t) {
55+
return t;
56+
}
57+
}
58+
59+
private static class Some<T> extends Option<T> {
60+
61+
private final T value;
62+
63+
public Some(T value) {
64+
this.value = value;
65+
}
66+
67+
@Override
68+
public Option<T> filter(Predicate<T> p) {
69+
return p.test(value) ? this : empty();
70+
}
71+
72+
@Override
73+
public <R> Option<R> map(Function<T, R> f) {
74+
return of(f.apply(value));
75+
}
76+
77+
@Override
78+
public <R> Option<R> flatMap(Function<T, Option<R>> f) {
79+
return f.apply(value);
80+
}
81+
82+
@Override
83+
public void forEach(Consumer<T> c) {
84+
c.accept(value);
85+
}
86+
87+
@Override
88+
public boolean isEmpty() {
89+
return false;
90+
}
91+
92+
@Override
93+
public T orElse(T t) {
94+
return value;
95+
}
96+
}
97+
98+
1299
// filter
100+
public abstract Option<T> filter(Predicate<T> p);
13101
// map
102+
public abstract <R> Option<R> map(Function<T, R> f);
14103
// flatMap
104+
public abstract <R> Option<R> flatMap(Function<T, Option<R>> f);
15105
// forEach
106+
public abstract void forEach(Consumer<T> c);
16107
// isEmpty
108+
public abstract boolean isEmpty();
17109
// orElse
110+
public abstract T orElse(T t);
18111
}
19112

20113

src/test/java/option/OptionalExample.java

+18
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ public void ifPresent() {
3232
}
3333
}
3434

35+
@Test
36+
public void map() {
37+
final Optional<String> o1 = getOptional();
38+
39+
final Function<String, Integer> getLength = String::length;
40+
41+
final Optional<Integer> expected = o1.map(getLength);
42+
43+
final Optional<Integer> actual;
44+
if (o1.isPresent()) {
45+
actual = Optional.of(getLength.apply(o1.get()));
46+
} else {
47+
actual = Optional.empty();
48+
}
49+
50+
assertEquals(expected, actual);
51+
}
52+
3553
private Optional<String> getOptional() {
3654
return ThreadLocalRandom.current().nextBoolean()
3755
? Optional.empty()

0 commit comments

Comments
 (0)