在 Java 中处理嵌套对象时 - 比如:
// bad code
game.getPlayer().getState().getPositionInfo().getCurrent().getX();
,尚不清楚嵌套引用是否会返回 null,从而导致抛出 NullPointerException。
我的想法是使用一种通用方法,在检查空引用时向下调用引用路径, 并且不抛出异常,而是返回 null。
错误处理超出了此解决方案的范围。
我的最小代码示例如下所示:
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。
您可以使用现有的库,例如vavr。
如果你愿意发明自己的轮子,至少可以从他们身上得到一些灵感。
您的具体情况只需
Optional
即可解决
Optional.ofNullable(game)
.map(x->x.getPlayer())
.map(x->x.getState())
.map(x->x.getPositionInfo())
.map(x->x.getCurrent())
.map(x->x.getX())
.orNull();