模仿 java Optional 设计 c# Optional
// Unity 环境下
using System;
using JetBrains.Annotations;
using Unity.VisualScripting;
using UnityEngine;
public static class OptionalEx
{
public static Optional<T> Op<T>(this T value)
{
return Optional<T>.Of(value);
}
}
public class Optional<T>
{
private readonly T value;
private bool isPresent => !value.IsUnityNull();
private Optional(T value)
{
this.value = value;
}
private Optional()
{
}
public static Optional<T> Of(T value)
{
return new Optional<T>(value);
}
public static Optional<T> Empty()
{
return new Optional<T>();
}
[CanBeNull]
public T Get()
{
return value;
}
public bool IsPresent()
{
return isPresent;
}
public T OrElse(T other)
{
return isPresent ? value : other;
}
public Optional<T> Filter(Func<T, bool> predicate)
{
if (!isPresent)
{
return this;
}
return predicate(value) ? this : Empty();
}
public Optional<T> Assert(string msg = null)
{
if (msg == null)
Debug.Assert(isPresent, $"Optional({this.DebugName()}) is not present");
else Debug.Assert(isPresent, msg);
return this;
}
public void IfPresent(Action<T> action)
{
if (isPresent)
{
action?.Invoke(value);
}
}
public T OrElseGet(Func<T> other)
{
if (isPresent)
{
return value;
}
return other();
}
public Optional<U> Map<U>(Func<T, U> mapper)
{
if (!isPresent)
{
return Optional<U>.Empty();
}
return Optional<U>.Of(mapper(value));
}
public Optional<U> FlatMap<U>(Func<T, Optional<U>> mapper)
{
if (!isPresent)
{
return Optional<U>.Empty();
}
return mapper(value);
}
public Optional<T> Log(string message)
{
if (isPresent)
{
Debug.Log(message);
}
return this;
}
public Optional<T> Log(Action<T> logAction)
{
if(isPresent)
logAction?.Invoke(value);
return this;
}
}
DEMO 举例
class Program
{
static void Main(string[] args)
{
Optional<string> optional = "Hello".Op();
optional
.Filter(x => x.StartsWith("H"))
.Map(x => x.Length)
.Log("Optional 有值")
.IfPresent(Console.WriteLine);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)