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 之类的直接写流畅
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.