使用Func的责任链

本·福斯特

我正在创建一个责任链管道,使用管道System.Func<T, T>中的每个功能都对下一个功能的引用。

在构建管道时,由于无法重新分配管道功能,因此无法通过引用传递内部函数,因为它引发了StackOverflowException,例如:

Func<string, Func<string, string>, string> handler1 = (s, next) => {
    s = s.ToUpper();
    return next.Invoke(s);
};

Func<string, string> pipeline = s => s;
pipeline = s => handler1.Invoke(s, pipeline);

pipeline.Invoke("hello"); // StackOverFlowException

我可以解决这个问题:

Func<string, Func<string, string>, string> handler1 = (s, next) => {
    s = s.ToUpper();
    return next.Invoke(s);
};

Func<Func<string, string>, Func<string, string>> closure = 
    next => s => handler1.Invoke(s, next);

Func<string, string> pipeline = s => s;
pipeline = closure.Invoke(pipeline);

pipeline.Invoke("hello");

但是,我想知道是否有更有效的方法来构建此功能链,也许使用表达式?

尤金·古本科夫

那个怎么样?这样,您可以构建任意长度的链。

void Main()
{
    Func<string, string> f1 = x => x.Replace("*", string.Empty);
    Func<string, string> f2 = x => x.Replace("--", string.Empty);
    Func<string, string> f3 = x => x.ToUpper();

    //Func<string, string> pipeline = x => f3(f2(f1(x)));
    Func<string, string> pipeline = Pipeline(f1, f2, f3);

    pipeline.Invoke("te-*-st").Dump(); // prints "TEST"
}

Func<T, T> Pipeline<T>(params Func<T, T>[] functions)
{
    Func<T, T> resultFn = x => x;

    for (int i = 0; i < functions.Length; i++)
    {
        Func<T, T> f = functions[i];
        Func<T, T> fPrev = resultFn;
        resultFn = x => f(fPrev(x));
    }

    return resultFn;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

责任链的使用

来自分类Java

如何使用Java Swing实施责任链

来自分类Dev

.NET Framework是否使用了责任链?

来自分类Dev

在机器学习中使用责任链模式

来自分类Dev

如何使用特征对象链实现责任链模式?

来自分类Dev

责任链范围

来自分类Dev

RxAndroid中的责任链

来自分类Dev

责任链实施

来自分类Dev

责任链 lambda 函数

来自分类Java

我为什么要对转换陈述使用责任链

来自分类Java

为什么要使用责任链而不是简单的for循环?

来自分类Dev

使用协程在python中实现责任链模式

来自分类Dev

在责任链模式中使用共享组件的最佳方法

来自分类Dev

责任链的常见用法?

来自分类Dev

责任链设计模式与使用简单的if-elseif-else块有什么区别?

来自分类Java

优化持续部署(取消THROU链的责任)

来自分类Java

Java泛型的责任链处理程序

来自分类Dev

责任链“恰到好处的处理者”

来自分类Dev

Kotlin泛型责任链模式

来自分类Java

责任链-通过所有链传递请求

来自分类Java

是责任链模式可以很好地替代的条件序列?

来自分类Java

与类别列表相比,责任链有什么优势?

来自分类Java

如何以可测试的方式实施责任链?

来自分类Dev

责任链与有限状态机-差异

来自分类Java

责任链模式中的Java 8 Stream和通用接口

来自分类Dev

责任链,这个模式到底是什么意思?

来自分类Dev

如何使用单一责任原则

来自分类Dev

Spring Boot 测试 - 模拟位于责任链深处的处理程序 Bean

来自分类Dev

责任链设计原理中的Java泛型编译器错误