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 << ) << endl;
}

void loadingFunctions()
{
    getFactorial = [](int n)
    {
        n--;
        )
            ;
        else
            )*getFactorial(n);
    };

    getSum = [](int n)
    {
        n--;
        )
            ;
        else
            ) + getSum(n);
    };

    getMaxBase4 = [](int n)
    {
        ;
        )
        {
             == )
            {
                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类型作为参数可以大大的简化我们的代码。

Lambda表达式与Function接口的更多相关文章

  1. 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

    一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...

  2. java8 Lambda 表达式和函数式接口快速理解

    前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...

  3. Lambda表达式和函数式接口

    写在有道笔记中,链接地址.欢迎各位看官提出意见交流讨论 http://note.youdao.com/noteshare?id=147109f1bf7f3ae97c43d77891e6ebc8 Lam ...

  4. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

  5. Lambda表达式与函数式接口

    Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...

  6. lambda表达式与函数接口的关系以及使用案例

    lambda表达式与函数式接口是结合使用的. 函数式接口:接口中只有一个抽象方法的接口,其中可以包括default修饰,static 修饰的实例方法.函数式接口可以在接口上添加@FuncationIn ...

  7. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

  8. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...

  9. java8新特性1:lambda表达式和函数式接口

    1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...

随机推荐

  1. JVM 1.类的加载、连接、初始化

    Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用 ...

  2. HTTP协议(转自:小坦克博客)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

  3. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. tilemap坐标转换

    像素点跟tile的索引之间的转换//从cocos2d-x坐标转换为Tilemap坐标CCPoint GameMap::tileCoordForPosition(CCPoint position){ i ...

  5. SQL Povit

    ),) ,,@logistics_code='All',@fee_type='All' ),) ,@strDateList='',@from_date=cast((ltrim(@yr)+'-'+ltr ...

  6. Nginx RTMP 专题

    说明: 记录器 - 记录器名称 path - 记录文件路径(recorded file path) (/tmp/rec/mystream-1389499351.flv)filename - 省略目录的 ...

  7. Runtime.getRuntime().addShutdownHook

      Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会 ...

  8. [转载] 分享D瓜哥最近攒的资料(架构方面)

    原文: http://www.diguage.com/archives/41.html 扯扯蛋 以前见过零零散散地介绍一些知名网站架构的分析文章.最近D瓜哥也想研究一下各大知名网站的架构.所以,就搜集 ...

  9. [LED]如何配置LCD背光和LED,调试方法

    [DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION]LCD背光和LED配置文件alps/custom/<proj name>lk/cust_leds.ca ...

  10. JavaSE复习_5 Eclipse的常见操作

    △用鼠标点击生成的java源文件,按下F4可以观察类的生成的层次结构 △window-showreview:可以显示命令窗口.   window-perspective-reset:可以将打乱的命令窗 ...