Lambda表达式与Function接口

Lambda表达式是一个匿名函数。C++ 11和 java 8 相继引入了有关对Lambda表达式的支持。

Lambda表达式对于高级语言而言并不是必要的,对于Java而言它的功能和一个简易的接口差不多,而C++也有传统的函数指针。但即便如此,lambda表达式还是一项颇受重视的高级语言新特性,因为它可以大大简化我们的代码,也提供了一条函数式编程的捷径。

 

简而言之,一个Lambda表达式可以看作一个变量。对于这种变量的类型java语言中引入了很多种。我们主要来研究使用比较多的Function接口。他是一个有两个泛型参数的接口,其中一个是返回值的类型,一个是参数的类型(注意这个接口只接受一个参数)。在java中,它可以被赋值为一个类静态方法、对象的方法、函数式接口,当然也包括我们提到的Lambda表达式。这里就要和C++的function类区分开了。在C++中,function接受的泛型是一个更格式化的函数声明格式,它可以接受更多的参数。因此虽然这两个function看似很亲近,实际上区别还是挺大的。这也是Java提供更多函数类型的原因。

 

下面是一个非常简单的示例,通过示例我们可以看出二者lambda表达式和所谓的function类型的不同。但是总体上而言大同小异。

java:

import java.util.function.Function;

public class Test 
{
    public static Function<Integer,Integer> getFactorial;
    public static Function<Integer,Integer> getSum;
    public static Function<Integer,Integer> getMaxBase4;

    public static void main(String[] args)
    {
        loadingFunctions();
        
        getResult(getFactorial, "10的阶乘是:");
        getResult(getSum, "10的和是:");
        getResult(getMaxBase4, "10的以内4的倍数的最大值是:");
    }
    
    
    public static void getResult(Function<Integer, Integer> f, String functionType)
    {
        System.out.println(functionType + f.apply(10));
    }
    
    public static void loadingFunctions()
    {
        getFactorial = (n) -> 
        {
            n--;
            if(n == 0)
                return 1;
            else
                return (n+1) * getFactorial.apply(n);
        };
        
        getSum = (n) ->
        {
            n--;
            if(n == 0)
                return 1;
            else
                return (n+1) + getSum.apply(n);
        };
        
        getMaxBase4 = (n) ->
        {
            int last = -1;
            while(n > 3)
            {
                if(n % 4 == 0)
                {
                    last = n;
                    break;
                }
                n--;
            }
            
            return last;
        };
    }
}

c++:

#include <iostream>
#include <string>
#include <functional>

using namespace std;

function<int(int)> getFactorial;
function<int(int)> getSum;
function<int(int)> getMaxBase4;

void getResult(function<int(int)> f, string functionName)
{
    cout << functionName << ":" << f(10) << endl;
}

void loadingFunctions()
{
    getFactorial = [](int n)
    {
        n--;
        if (n == 0)
            return 1;
        else
            return (n + 1)*getFactorial(n);
    };

    getSum = [](int n)
    {
        n--;
        if (n == 0)
            return 1;
        else
            return (n + 1) + getSum(n);
    };


    getMaxBase4 = [](int n)
    {
        int last = -1;
        while (n > 3)
        {
            if (n % 4 == 0)
            {
                last = n;
                break;
            }
            n--;
        }

        return last;
    };
}

int main()
{
    loadingFunctions();

    getResult(getFactorial, "10的阶乘");
    getResult(getSum, "10的和");
    getResult(getMaxBase4, "10以下4的倍数的最大值");

    cout << "--------" << endl;
    system("pause");
}

这两个示例中,我们可以看到我们虽然都调用同一个getResult方法,而打印的结果是不同的,原因就是我们传入了不同的方法函数作为参数。用这种function类型作为参数可以大大的简化我们的代码。

 

转载于:https://www.cnblogs.com/AkazaAkari/p/5940079.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值