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 << ) << 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接口的更多相关文章
- 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用
一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...
- java8 Lambda 表达式和函数式接口快速理解
前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...
- Lambda表达式和函数式接口
写在有道笔记中,链接地址.欢迎各位看官提出意见交流讨论 http://note.youdao.com/noteshare?id=147109f1bf7f3ae97c43d77891e6ebc8 Lam ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
- Lambda表达式与函数式接口
Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...
- lambda表达式与函数接口的关系以及使用案例
lambda表达式与函数式接口是结合使用的. 函数式接口:接口中只有一个抽象方法的接口,其中可以包括default修饰,static 修饰的实例方法.函数式接口可以在接口上添加@FuncationIn ...
- Java8新特性(一)——Lambda表达式与函数式接口
一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...
- 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...
- java8新特性1:lambda表达式和函数式接口
1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...
随机推荐
- [转]Socket send函数和recv函数详解
1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...
- HDU 1728 逃离迷宫
[题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...
- implement "slam_karto" package on a Freight robot
1. login ssh fetch@<robot ip or robot name> 2. set robot master modify .bashrc in robot's com ...
- hdu 5023 A Corrupt Mayor's Performance Art 线段树
A Corrupt Mayor's Performance Art Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100 ...
- Windows Live Writer配置
Windows Live Writer手工配置步骤: 1.在菜单中选择"Weblog";,然后选择"Another Weblog Service". 2.在We ...
- Nginx入门笔记之————配置文件结构
在nginx.conf的注释符号位# nginx文件的结构,这个对刚入门的同学,可以多看两眼. 默认的config: #user nobody; worker_processes ; #error_l ...
- C#中“==”和equals()的区别
如以下代码: 1 2 3 4 5 6 7 8 9 int age = 25; short newAge = 25; Console.WriteLine(age == newAge); //t ...
- 9月java货车版速记
运算符的优先级java自带的方法正则表达式数组和二维数组:数组遍历,填充数组,数组排序,复制数组,数组查询数组算法:冒泡,选择,反转,快速类和对象:封装,继承,多态,this关键字,抽象类和接口重写和 ...
- ORA-32004 参数设置过时的解决办法
启动时报错: 查看日志: view /opt/oracle11g/app/db/diag/rdbms/yldev/yldev/trace/alert_yldev.log 原来是plsql_debug ...
- (二)stm32之中断配置
一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...