V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazinnnn
V2EX  ›  程序员

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

  •  
  •   yazinnnn · 2023-02-09 16:21:40 +08:00 · 858 次点击
    这是一个创建于 435 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2748 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.