将lambda函数作为参数传递,并在方法主体中提供其参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将lambda函数作为参数传递,并在方法主体中提供其参数相关的知识,希望对你有一定的参考价值。

[我有一种方法可以处理插件的一些分页逻辑;

public async Task<JsonResult> DataPagination()
{
    List<GLAccountModel> glAccounts = await HttpClientHelper.GetListHttpResponseAsync<GLAccountModel>(httpBaseAdress, "GLAccount", "GetAll");

    var (filteredResultCount, totalRecord) = DataTableHelper.ManageDataTable(glAccounts, Request, x => x.Name.Contains());

    return Json(new { data = glAccounts, draw = Request["draw"], recordsTotal = totalRecord, recordsFiltered = filteredResultCount });
}

[这里,我将lambda函数x => x.Name.Contains()传递给ManageDataTable方法。这是ManageDataTable方法的实现;

public static (int, int) ManageDataTable<TModel>(List<TModel> models, HttpRequestBase request, Func<TModel, bool> lambdaExpression) where TModel : class
{               
    string search = request["search[value]"];//arama

    if (!string.IsNullOrEmpty(search))
    {
        models = models.Where(lambdaExpression).ToList();
    }

    return (filteredResultCount, totalRecord);
}

我希望能够在Contains()方法的主体中提供ManageDataTable()方法的参数,而不是随参数本身一起发送。更清楚地说,我想从x => x.Name.Contains()接收lambda函数ManageDataTable(),并且在ManageDataTable()主体内部,我希望能够给Contains()方法提供参数,这是我的lambda的一部分功能。那可能吗?谢谢。

答案

我可以在这里根据更改方法参数来想到两个选项。您可以像这样将其设置为Func<string, Func<TModel, bool>>

public static (int, int) ManageDataTable<TModel>(
    List<TModel> models,
    HttpRequestBase request,
    Func<string, Func<TModel, bool>> filterProvider)
    where TModel : class
{
    string search = request["search[value]"];//arama

    if (!string.IsNullOrEmpty(search))
    {
        var filter = filterProvider(search);
        models = models.Where(filter).ToList();
    }

    return (filteredResultCount, totalRecord);
}

您会这样称呼:

DataTableHelper.ManageDataTable(glAccounts, Request,
    search => model => model.Name.Contains(search));

此方法实际上是高阶方法。或者,您可以像这样输入Func<TModel, string, bool>

public static (int, int) ManageDataTable<TModel>(
    List<TModel> models,
    HttpRequestBase request,
    Func<TModel, string, bool> filter)
    where TModel : class
{
    string search = request["search[value]"];//arama

    if (!string.IsNullOrEmpty(search))
    {
        models = models.Where(model => filter(model, search)).ToList();
    }

    return (filteredResultCount, totalRecord);
}

您会这样称呼:

DataTableHelper.ManageDataTable(glAccounts, Request,
    (model, search) => model.Name.Contains(search));

使用哪一个无关紧要,但是值得您确保他们都理解。

以上是关于将lambda函数作为参数传递,并在方法主体中提供其参数的主要内容,如果未能解决你的问题,请参考以下文章

Java8部分新特性的学习

Java8部分新特性的学习

lambda表达式由啥组成

Java -- Lambda表达式;函数式接口

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

Java 8实战 第三章