either
使用流时如果发生异常不希望停止处理流,either类型是函数式语言中的常见类型而不是java的一部分。与java中的optional类型类似,either是具有两种可能性的通用包装器。例如,如果我们有一个either值,那么这个值可以包含string类型或integer类型either<string,integer>。
public class either<l, r> {
private final l left;
private final r right;
private either(l left, r right) {
this.left = left;
this.right = right;
}
public static <l,r> either<l,r> left( l value) {
return new either(value, null);
}
public static <l,r> either<l,r> right( r value) {
return new either(null, value);
}
public optional<l> getleft() {
return optional.ofnullable(left);
}
public optional<r> getright() {
return optional.ofnullable(right);
}
public boolean isleft() {
return left != null;
}
public boolean isright() {
return right != null;
}
public <t> optional<t> mapleft(function<? super l, t> mapper) {
if (isleft()) {
return optional.of(mapper.apply(left));
}
return optional.empty();
}
public <t> optional<t> mapright(function<? super r, t> mapper) {
if (isright()) {
return optional.of(mapper.apply(right));
}
return optional.empty();
}
public string tostring() {
if (isleft()) {
return "left(" + left +")";
}
return "right(" + right +")";
}
}