gpt4 book ai didi

java - 空合并运算符的替代方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:30 27 4
gpt4 key购买 nike

使用 Java,安全地访问像这样的深层嵌套引用a.b.c.d.e,我们通常必须在每个级别指定 null 检查或包装在 Optional 中并使用 orElse()。 (与 Kotlin/C# 等语言不同,其中 a?.b?.c?.d?.e 或类似作品。

我想知道以下辅助方法是否是一个合理的替代方法:

public <T> T valueOrNull(Supplier<T> expression) {
try {
return expression.get();
} catch (NullPointerException e) {
return null;
}
}

这可以安全地与 value = valueOrNull(() -> a.b.c.d.e) 一起使用。

注意:我知道捕获 NullPointerException 通常因为性能原因和其他原因而不被接受,但我想知道这里的用法是否是一个合理的异常。

最佳答案

你可以编写一个函数,它接受一个值和一个 getter 来转换它,就像这样

public static <T1, T2> T1 coalesce(T2 value, Function<T2,T1> f1){
return f1.apply(value);
}

然后你可以这样调用 coalesce(value, Clazz::getA)

对于链中的每一步,您都需要在合并函数中添加一个额外的函数,就像这样

public static <T1, T2, T3> T1 coalesce(T3 value, Function<T3,T2> f1, Function<T2,T1> f2){
T2 t2 = f1.apply(value);
if(t2 == null)
return null;
return f2.apply(t2);
}

深度为二,

public static <T1, T2, T3, T4> T1 coalesce(T4 value, Function<T4,T3> f1, Function<T3,T2> f2, Function<T2,T1> f3){
T3 t3 = f1.apply(value);
if(t3 == null)
return null;
T2 t2 = f2.apply(t3);
if(t2 == null)
return null;
return f3.apply(t2);
}

深度为 3,以此类推。

示例代码:

    A test1 = new A(null);
A test2 = new A(new B(null));
A test3 = new A(new B(new C(null)));
A test4 = new A(new B(new C("1234")));

System.out.println(coalesce(test1, A::getB, B::getC, C::getS));
System.out.println(coalesce(test2, A::getB, B::getC, C::getS));
System.out.println(coalesce(test3, A::getB, B::getC, C::getS));
System.out.println(coalesce(test4, A::getB, B::getC, C::getS));

System.out.println(coalesce(test2, A::getB));
System.out.println(coalesce(test3, A::getB, B::getC));

A 是一个具有类 B 成员的类,B 是一个具有类 C 成员的类,C 是一个具有类 String 成员的类,具有适当的 getter。输出符合预期:

null
null
null
1234
B@776ec8df
C@41629346

前三种情况为空,C中的字符串为空,第四种为字符串的值,第五种和第六种分别返回类型B和C的对象。

不幸的是,我没有找到让代码更短的方法。

关于java - 空合并运算符的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com