Files
lancet/docs/api/packages/datastructure/optional.md
donutloop fdc93c8cc7 Change naming (#177)
Utilize terminology from the Go SDK rather than introducing novel terms to describe concepts.
2024-02-24 17:25:31 +08:00

7.1 KiB
Raw Blame History

Optional

Optional类型代表一个可选的值它要么包含一个实际值要么为空。

源码

用法

import (
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

目录

文档

Of

返回一个包含非空值的Optional。

函数签名:

func Of[T any](value T) Optional[T]

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    value := 42
    opt := optional.Of(value)

    fmt.Println(opt.Get())

    // Output:
    // 42
}

FromNillable

返回一个包含给定值的Optional该值可能为空 (nil)。

函数签名:

func FromNillable[T any](value *T) Optional[T]

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    var value *int = nil
    opt := optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())

    value = new(int)
    *value = 42
    opt = optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())


    // Output:
    // false
    // true
}

Default

返回一个空Optional实例。

函数签名:

func Default[T any]() Optional[T]

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    fmt.Println(optDefault.IsNil())

    // Output:
    // true
}

IsNil

验证Optional是否为空。

函数签名:

func (o Optional[T]) IsNil() bool

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    fmt.Println(optDefault.IsNil())

    // Output:
    // true
}

IsNotNil

检查当前Optional内是否存在值。

函数签名:

func (o Optional[T]) IsNotNil() bool

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    var value *int = nil
    opt := optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())

    value = new(int)
    *value = 42
    opt = optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())


    // Output:
    // false
    // true
}

IfNotNil

如果值存在则使用action方法执行给定的操作。

函数签名:

func (o Optional[T]) IfNotNil(action func(value T))

示例:

package main

import (
    "fmt"
     "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    called := false
    action := func(value int) { called = true }

    optDefault := optional.Default[int]()
    optDefault.IfNotNil(action)

    fmt.Println(called)

    called = false // Reset for next test
    optWithValue := optional.Of(42)
    optWithValue.IfNotNil(action)

    fmt.Println(optWithValue.IsNotNil())

    // Output:
    // false
    // true
}

IfNotNilOrElse

根据是否存在值执行相应的操作:有值则执行指定操作,没有值则执行默认操作。

函数签名:

func (o Optional[T]) IfNotNilOrElse(action func(value T), fallbackAction func())

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    calledWithValue := false
    valueAction := func(value int) { calledWithValue = true }
    emptyAction := func() { t.Errorf("Empty action should not be called when value is present") }

    optWithValue := optional.Of(42)
    optWithValue.IfNotNilOrElse(valueAction, emptyAction)

    fmt.Println(calledWithValue)

    calledWithEmpty := false
    valueAction = func(value int) { t.Errorf("Value action should not be called when value is not present") }
    emptyAction = func() { calledWithEmpty = true }

    optDefault := optional.Default[int]()
    optDefault.IfNotNilOrElse(valueAction, emptyAction)

    fmt.Println(calledWithEmpty)

    // Output:
    // true
    // true
}

Unwrap

如果存在返回该值否则引发panic。

函数签名:

func (o Optional[T]) Unwrap() T

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    value := 42
    opt := optional.Of(value)

    fmt.Println(opt.Unwrap())

    // Output:
    // 42
}

OrElse

检查Optional值是否存在如果存在则直接返回该值。如果不存在返回参数other值。

函数签名:

func (o Optional[T]) OrElse(other T) T

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Empty[int]()
    val := optDefault.OrElse(100)
    fmt.Println(val)

    optWithValue := optional.Of(42)
    val = optWithValue.OrElse(100)
    fmt.Println(val)

    // Output:
    // 100
    // 42
}

OrElseGet

检查Optional值是否存在如果存在则直接返回该值。如果不存在则调用一个提供的函数 (supplier),并返回该函数的执行结果。

函数签名:

func (o Optional[T]) OrElseGet(action func() T) T

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    action := func() int { return 100 }

    val := optDefault.OrElseGet(action)
    fmt.Println(val)

    // Output:
    // 100
}

OrElseTrigger

检查Optional值是否存在如果存在则直接返回该值否则返回错误。

函数签名:

 OrElseTrigger(errorHandler func() error) (T, error)

示例:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    _, err := optDefault.OrElseTrigger(func() error { return errors.New("no value") })
    
    fmt.Println(err.Error())

    optWithValue := optional.Of(42)
    val, err := optWithValue.OrElseTrigger(func() error { return errors.New("no value") })

    fmt.Println(val)
    fmt.Println(err)

    // Output:
    // no value
    // 42
    // nil
}