没有任何类型是Java 8,所以你需要自己创建一个或使用一些第三方库。
有可选的存在不难建立这样的功能:
请注意,这不支持将值映射到null,但由于Scala不支持null,因此没有明确定义的行为。一个替代方法是检查这个并立即抛出异常,如果一个函数返回null。也可以实现支持空值的Either或者Optional的变体,尽管这可能会感觉不自然。如果期望的行为是Option [Either [L,R]] anywad,则很容易改变类以支持“无”状态。
final class Either
{
public static Either left(L value) {
return new Either<>(Optional.of(value), Optional.empty());
}
public static Either right(R value) {
return new Either<>(Optional.empty(), Optional.of(value));
}
private final Optional left;
private final Optional right;
private Either(Optional l, Optional r) {
left=l;
right=r;
}
public T map(
Function super L, ? extends T> lFunc,
Function super R, ? extends T> rFunc)
{
return left.map(lFunc).orElseGet(()->right.map(rFunc).get());
}
public Either mapLeft(Function super L, ? extends T> lFunc)
{
return new Either<>(left.map(lFunc),right);
}
public Either mapRight(Function super R, ? extends T> rFunc)
{
return new Either<>(left, right.map(rFunc));
}
public void apply(Consumer super L> lFunc, Consumer super R> rFunc)
{
left.ifPresent(lFunc);
right.ifPresent(rFunc);
}
}
示例用例:
new Random().ints(20, 0, 2).mapToObj(i -> (Either)(i==0?
Either.left("left value (String)"):
Either.right(42)))
.forEach(either->either.apply(
left ->{ System.out.println("received left value: "+left.substring(11));},
right->{ System.out.println("received right value: 0x"+Integer.toHexString(right));}
));