PowerShell中Java Optional(可选类型)的等效实现及用法
PowerShell 中的可选值实现方案
1. 自定义可选类型(推荐)
可以自己封装一个轻量的[Optional]类,模拟Java Optional<T>的核心功能:
class Optional { hidden [object] $Value hidden [bool] $HasValue # 私有构造函数,禁止直接实例化 hidden Optional([object]$value, [bool]$hasValue) { $this.Value = $value $this.HasValue = $hasValue } # 创建包含有效值的实例 static [Optional] Of([object]$value) { if ($value -eq $null) { throw "无法为null创建Optional实例" } return [Optional]::new($value, $true) } # 创建空实例 static [Optional] Empty() { return [Optional]::new($null, $false) } # 获取值,无值时抛出异常 [object] GetValue() { if (-not $this.HasValue) { throw "Optional中无可用值" } return $this.Value } # 获取值,无值时返回指定默认值 [object] GetValueOrDefault([object]$defaultValue) { return $this.HasValue ? $this.Value : $defaultValue } # 判断是否包含有效值 [bool] HasValue() { return $this.HasValue } }
2. 改造你的FindElement函数
将原函数的返回值替换为[Optional]实例:
function FindElement { param( [object]$element ) if ($element -ne $null) { $valueFromXml = $element.InnerText Write-Information "valueFromXml found in xml: $valueFromXml " return [Optional]::Of($valueFromXml) } else { Write-Information "valueFromXml not found." return [Optional]::Empty() } }
3. 调用函数后的返回值处理
调用FindElement后,通过类的方法安全处理返回值:
方式1:判断有效值后获取(无值时主动处理)
$result = FindElement -element $targetElement if ($result.HasValue()) { $actualValue = $result.GetValue() # 处理有值的业务逻辑 Write-Host "获取到内容:$actualValue" } else { # 处理无值的业务逻辑 Write-Host "未找到目标元素内容" }
方式2:无值时返回默认值
$result = FindElement -element $targetElement $actualValue = $result.GetValueOrDefault("默认填充内容") Write-Host "最终使用值:$actualValue"
4. 原生替代方案(无需自定义类)
如果不想自定义类,可用PowerShell原生哈希表模拟可选值结构:
function FindElement { param([object]$element) if ($element -ne $null) { $valueFromXml = $element.InnerText Write-Information "valueFromXml found in xml: $valueFromXml " return @{ HasValue = $true; Value = $valueFromXml } } else { Write-Information "valueFromXml not found." return @{ HasValue = $false; Value = $null } } } # 调用处理示例 $result = FindElement -element $targetElement if ($result.HasValue) { Write-Host "获取到值:$($result.Value)" }
内容的提问来源于stack exchange,提问作者fascynacja
相关产品推荐
相关产品推荐

