这是一个经过静态检查的类型安全解决方案;这意味着您无法创建运行时错误。请按其含义阅读前一句。是的,您可以以某种方式引发异常...
这很冗长,但是嘿,它是Java!
public class Either<A,B> {
interface Function<T> {
public void apply(T x);
}
private A left = null;
private B right = null;
private Either(A a,B b) {
left = a;
right = b;
}
public static <A,B> Either<A,B> left(A a) {
return new Either<A,B>(a,null);
}
public static <A,B> Either<A,B> right(B b) {
return new Either<A,B>(null,b);
}
/* Here's the important part: */
public void fold(Function<A> ifLeft, Function<B> ifRight) {
if(right == null)
ifLeft.apply(left);
else
ifRight.apply(right);
}
public static void main(String[] args) {
Either<String,Integer> e1 = Either.left("foo");
e1.fold(
new Function<String>() {
public void apply(String x) {
System.out.println(x);
}
},
new Function<Integer>() {
public void apply(Integer x) {
System.out.println("Integer: " + x);
}
});
}
}
你可能想看看 Functional Java 和 Tony Morris 的博客。
这是在函数式Java中实现的链接。在我的示例中,该示例称为此处。他们有一个更复杂的版本,能够返回一个值(这似乎适合函数式编程风格)。Either
fold
either
fold