-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResult.java
83 lines (69 loc) · 2.14 KB
/
Result.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import lombok.AccessLevel;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
@ToString @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Result<T> {
private final T data;
private final Exception error;
public static <T> Result<T> succeed(@NonNull T data) {
return new Result<>(data, null);
}
public static <T> Result<T> fail(@NonNull Exception e) {
return new Result<>(null, e);
}
public static <T> Result<T> generate(Supplier<T> generator) {
try {
return Result.succeed(generator.get());
} catch (Exception e) {
return Result.fail(e);
}
}
public T get() throws Exception {
if (null == data) {
throw error;
} else {
return data;
}
}
public Optional<T> get(Consumer<Exception> exceptionHandler) throws Exception {
if (null == data) {
exceptionHandler.accept(error);
return Optional.empty();
} else {
return Optional.of(data);
}
}
public void consume(Consumer<T> dataConsumer, Consumer<Exception> exceptionHandler) throws Exception {
if (null == data) {
exceptionHandler.accept(error);
} else {
dataConsumer.accept(data);
}
}
public <R> Result<R> map(Function<T, R> dataTransformer) {
if (null != data) {
return Result.generate(() -> dataTransformer.apply(data));
} else {
return Result.fail(error);
}
}
public <R> Optional<R> mapToOptional(Function<T, R> dataTransformer, Consumer<Exception> exceptionHandler) {
if (null == data) {
exceptionHandler.accept(error);
return Optional.empty();
} else {
return Optional.ofNullable(dataTransformer.apply(data));
}
}
public boolean succeeded() {
return null != data;
}
public boolean failed() {
return !succeeded();
}
}