https://gist.github.com/yazinnnn/2af2af906e98157966175fbc481c1f6c
java19 开预览
密封接口 Either,包含几个基本的成员方法:
isLeft, isRight, fold, map, mapLeft, flatMap, swap, getOrElse, getOrNull, toOptional
还有几个静态方法 catching,left,right
实现类 Left 和 Right,用 record 简单包了一下值
用 record 为了模式匹配能解构出 property,但是 record 不支持继承,所以 Either 改成了密封接口
测试代码
var str = Either.<Throwable, String>right("str");
var integer = Either.<Throwable, Integer>right(100);
var fail = Either.<Throwable, Integer>left(new RuntimeException("boom"));
var length = str.map(s -> s.length());
var _100 = str.flatMap(s -> integer);
var _fail = _100.flatMap(i -> fail);
var r = str.fold(t -> 1, s -> 2);
System.out.println(str);
System.out.println(length);
System.out.println(integer);
System.out.println(fail);
System.out.println(_100);
System.out.println(_fail);
System.out.println(length.getOrNull());
System.out.println(_100.getOrNull());
System.out.println(_fail.getOrNull());
System.out.println(_fail.toOptional());
System.out.println(r);
// switch (str) {
// case Left<Throwable, String>(Throwable t) -> {
// }
//
// case Right<Throwable, String>(String s) -> {
// }
// }
打印结果
right{value=3}
right{value=100}
left{value=java.lang.RuntimeException: boom}
right{value=100}
left{value=java.lang.RuntimeException: boom}
3
100
null
Optional.empty
2
在测试代码里尝试用模式匹配去解构 either, 居然会报缺少分支, jcp 真的是....
而且由于 java 弱鸡的类型推断,匹配出来的类型也是一坨,还不如用 fold 之类的直接写流畅