8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Java - 通过通用函数执行实现空安全

Boann 1月前

15 0

在处理 Java 中的嵌套对象时 - 类似:// bad codegame.getPlayer().getState().getPositionInfo().getCurrent().getX();,不清楚嵌套引用是否会返回 null

当处理 Java 中的嵌套对象时 - 类似于:

// bad code
game.getPlayer().getState().getPositionInfo().getCurrent().getX();

,不清楚嵌套引用是否会返回 null 从而导致抛出 NullPointerException。

我的想法是有一个通用方法,它在检查空引用时调用引用路径,而不是抛出异常,而是返回空值。

错误处理超出了此解决方案的范围。

我的最小代码示例如下所示:

import java.util.function.Function;

public class Main {

    public static void main(String[] args) {
        // Check 1: baseline - "normal" function mappings
        SAVE.TY_Baseline(b -> b.contains("a"), "aoiudssaiud"); // works

        // Check 2: nested types
        Team t = new Team(new Team(null));
        Team t1 = SAVE.TY_Chained(() -> t.getTeam(), z -> z.getTeam()); // does not compile

        // Check 3: String -> boolean -> String
        String g = "Hi !";
        // does not compile
        Team t2 = SAVE.TY_Chained(() -> g.contains("Hi"), b -> b ? "contained" : "not contained"); 
    }

    public static class Team {
        private Team t = null;
        public Team(Team t) {
            this.t = t;
        }
        public Team getTeam() {
            return t;
        }
    }

    public static interface SAVE {
        public static <A, B> B TY_Chained(Function<Void, A> first , Function<A, B> second) {
            A firstResult = first.apply(null);
            if (firstResult == null)
                return null;
            return second.apply(firstResult);
        }
        public static <A,B> B TY_Baseline(Function<A,B> oo, A in) {
            return oo.apply(in);
        }
    }
}

对于检查 1:一切顺利,函数执行并且编译器将输入识别为字符串并接受该函数。

对于检查 2 和 3:在链接函数时,编译器不知道函数 \'second\' 具有哪种参数类型,因此不会接受此方法调用。获取:

java: incompatible types: incompatible parameter types in lambda expression

现在使用 OpenJDK V22。

帖子版权声明 1、本帖标题:Java - 通过通用函数执行实现空安全
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Boann在本站《function》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 看看 Kotlin 和 \'safe-null\' 运算符 - 它确实

  • 您可以使用现有的库,例如 vavr .

    如果你愿意发明自己的轮子,你至少可以从他们那里得到一些灵感。

    您的具体情况非常简单,无需第三方库即可解决。只需 Optional 使用标准 JDK。

    Optional.ofNullable(game)
      .map(x->x.getPlayer())
      .map(x->x.getState())
      .map(x->x.getPositionInfo())
      .map(x->x.getCurrent())
      .map(x->x.getX())
      .orElse(null);
    
  • 检查 2 和 3 失败了,因为你提供了 first 一个没有参数的函数,而它期望的是一个带有一个参数的函数。更改 TY_CHAINED 的签名:

    public static <A, B> TY_CHAINED(Supplier<A> first, Function<A, B> second) {
      A firstResult = first.get();
      if (firstReslt == null) return null;
      return second.apply(firstResult);
    }
    

    A Function<Void, A> 必须为空的 that must be null (因为 null 是该类型的唯一有效值 Void )。

    否则,我同意 talex 的观点, Optional.map() 它最适合空链

返回
作者最近主题: