"foo?.bar"在Groovy中是什么意思?

What does "foo?.bar" mean in Groovy?

#{if adsonuiAssetList.size()>0}
    #{list items:adsonuiAssetList, as:'adsonui'}
        <div class="imageElement">
            <h3>Asset : ${adsonui?.productname}(${adsonui?.AssetId})&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Advertiser : ${adsonui?.campaign.advertiser.contact_person}(${adsonui?.campaign.advertiser.id})</h3>
            <p></p>
            <a href="@{Assets.showAssetDetails()}?assetid=${adsonui?.AssetId}"  title="${adsonui?.productname}" class="open"></a>
            <img src="@{Assets.getAssetFileForSlideShow(adsonui?.AssetId,adsonui?.campaign?.mode_of_advertisement,870,240)}"  alt="${adsonui?.productname}" class="full" />
            <img src="@{Assets.getAssetFileForSlideShow(adsonui?.AssetId,adsonui?.campaign?.mode_of_advertisement,150,150)}"  alt="${adsonui?.productname}" class="thumbnail" />
    </div>
    #{/list}
#{/if}

任何人都可以解释 ${adsonui?.productname} 是什么吗?代表我是 groovy 的新手并且玩框架 pelase 告诉我它到底在做什么。

如果 adsonui 不为空,

${adsonui?.productname} 将 return adsonui.productname

null 如果它为空。

它被称为 Safe-Navigation Operator

?能够在 foo 为 null 的情况下避免 NPE 异常。

查看示例 - 第一个 println 给出 null,第二个失败

def foo

println foo?.bar

null

println foo.bar

Caught: java.lang.NullPointerException: Cannot get property 'bar' on null object 

即您无需测试 foo 是否为 null 并决定是否可以引用 bar