Java 8 中的复杂取消引用链的空检查
Null checks for a complex dereference chain in Java 8
所以我有一个 class 由一些具有多个数据层的合同生成(因此不允许修改),我通过 soap 请求获得它然后在我的后端我有这样的东西:
value = bigRequest.getData().getSamples().get(0).getValuableData().getValue()
并且在该链中的每个取消引用中,我都可以得到空结果。 Class 本身没有逻辑,只是带有访问器的纯数据,但尽管如此。我有点厌倦了为每个取消引用制作一个丑陋的非空检查样板,所以我在这里考虑最佳实践:
- 实际上制作丑陋的样板文件(使用 ifs 或断言)。我认为这是我必须要做的,但我希望渺茫。
- 做一些可选的魔术。但由于无法修改源代码,它可能会更加丑陋。
- 赶上 NPE。它的内心是丑陋的,但在这种特殊情况下,我觉得它是最好的选择,只是因为它是逻辑的一部分,无论我有没有那个价值。但是抓到NPE让我不寒而栗
- 我现在自己看不到的东西。
其实我对这个问题感觉有点不自在,因为我觉得NPE主题已经深入骨髓,但我没有搜索成功。
我同意你们两个的观点,Andrew Vershinin 的建议是我们在这里所能做的最好的,因此值得作为答案发布。
nullableValue = Optional.ofNullable(bigRequest)
.map(RequestCls::getData)
.map(DataCls::getSamples)
.filter(samples -> ! samples.isEmpty())
.map(samples -> samples.get(0))
.map(SampleCls::getValuableData)
.map(ValDataCls::getValue)
.orElse(null);
您需要在方法引用中替换正确的 class 或接口名称(或者您可以根据需要重写为 lambda)。编辑:如果 bigRequest
本身不能是 null
,第一个方法调用应该只是 Optional.of(bigRequest)
.
这不是 Optional
的主要用途,但我觉得还可以。比你的问题中的第 1 项和第 3 项(和第 4 项)更好。
所以我有一个 class 由一些具有多个数据层的合同生成(因此不允许修改),我通过 soap 请求获得它然后在我的后端我有这样的东西:
value = bigRequest.getData().getSamples().get(0).getValuableData().getValue()
并且在该链中的每个取消引用中,我都可以得到空结果。 Class 本身没有逻辑,只是带有访问器的纯数据,但尽管如此。我有点厌倦了为每个取消引用制作一个丑陋的非空检查样板,所以我在这里考虑最佳实践:
- 实际上制作丑陋的样板文件(使用 ifs 或断言)。我认为这是我必须要做的,但我希望渺茫。
- 做一些可选的魔术。但由于无法修改源代码,它可能会更加丑陋。
- 赶上 NPE。它的内心是丑陋的,但在这种特殊情况下,我觉得它是最好的选择,只是因为它是逻辑的一部分,无论我有没有那个价值。但是抓到NPE让我不寒而栗
- 我现在自己看不到的东西。
其实我对这个问题感觉有点不自在,因为我觉得NPE主题已经深入骨髓,但我没有搜索成功。
我同意你们两个的观点,Andrew Vershinin 的建议是我们在这里所能做的最好的,因此值得作为答案发布。
nullableValue = Optional.ofNullable(bigRequest)
.map(RequestCls::getData)
.map(DataCls::getSamples)
.filter(samples -> ! samples.isEmpty())
.map(samples -> samples.get(0))
.map(SampleCls::getValuableData)
.map(ValDataCls::getValue)
.orElse(null);
您需要在方法引用中替换正确的 class 或接口名称(或者您可以根据需要重写为 lambda)。编辑:如果 bigRequest
本身不能是 null
,第一个方法调用应该只是 Optional.of(bigRequest)
.
这不是 Optional
的主要用途,但我觉得还可以。比你的问题中的第 1 项和第 3 项(和第 4 项)更好。