我需要一种用于null检查的通用方法。我提出了一个要求。 这是我上课的设置方法:
placeHolderValues.setCurrentAddressCountry(communicationSO.getApplicationDetailSO().getApplicantDetails().get(0).getAddressDetail().get(0).getCountry());
我只想在存在值的情况下在placeHolderValues.setCurrentAddressCountry()
中设置值。如果getApplicationDetailSO()
或getApplicantDetails()
或getAddressDetail()
或getCountry()
中的任何一个为NULL,则必须在placeHolderValues.setCurrentAddressCountry()
中设置NULL。我几乎有30种这样的二传手。
我需要一种通用的方法来实现相同的目标。
答案 0 :(得分:4)
严重的非回答:不要那样做。
使用getA().getB().getC().getD()...getTheThingYouWant()
确实是不好的做法。
这显然违反了Law Of Demeter。
因此,除了您遇到的问题(关于检查null)之外,此类构造实际上是非常邪恶的。您会看到,使用此代码的类必须必须知道A有一个B,而B有一个C。依此类推。这直接将该类与所有类A,B,C等相结合。
real 的答案是避免此类更改。如果有的话,您进行getA().getMeWhatINeed()
。
唯一的另一种选择:在进入此类调用链之前,完全(先一步验证)您的输入数据。
答案 1 :(得分:2)
您可以使用Optional.ofNullable
并将该值反复map
转换为另一个,除非您在途中对null
进行加密,然后获得最终值orElse
{{1} }。
null
这仍然不是很漂亮,但是至少您不必重复不同的方法调用。其中一些lambda(var value = Optional.ofNullable(communicationSO)
.map(x -> x.getApplicationDetailSO())
.map(x -> x.getApplicantDetails())
.map(x -> x.get(0))
.map(x -> x.getAddressDetail())
.map(x -> x.get(0))
.map(x -> x.getCountry())
.orElse(null);
placeHolderValues.setCurrentAddressCountry(value);
)可能也可以用适当的Method引用代替。 (->
)仍然比将行包装到::
块中并try
将catch
包装起来要好。