尝试用高版本 Java 写了一个 either 类

2023-02-09 16:21:40 +08:00
 yazinnnn

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 之类的直接写流畅

870 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/914630

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX