
最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下函数式接口内容。
我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象方法的参数列表和返回值类型。因此为了让我们使用Lambda表达式更加的方法,在JDK中提供了大量常用的函数式接口
在JDK中帮我们提供的有函数式接口,主要是在 javautilfunction 包中。
无参有返回值的接口,对于的Lambda表达式需要提供一个返回数据的类型。
使用:
有参无返回值得接口,前面介绍的Supplier接口是用来生产数据的,而Consumer接口是用来消费数据的,使用的时候需要指定一个泛型来定义参数类型
使用:将输入的数据统一转换为小写输出
默认方法:andThen
如果一个方法的参数和返回值全部是Consumer类型,那么就可以实现效果,消费一个数据的时候,首先做一个 *** 作,然后再做一个 *** 作,实现组合,而这个方法就是Consumer接口中的default方法 andThen方法
具体的 *** 作
有参有返回值的接口,Function接口是根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有参数有返回值。
使用:传递进入一个字符串返回一个数字
默认方法:andThen,也是用来进行组合 *** 作,
默认的compose方法的作用顺序和andThen方法刚好相反
而静态方法identity则是,输入什么参数就返回什么参数
有参且返回值为Boolean的接口
使用:
在Predicate中的默认方法提供了逻辑关系 *** 作 and or negate isEquals方法
一般的办法是这样:
1 查询dll的导出函数表来得到该dll导出了多少个函数。这可以通过工具软件得到,比如PE Explorer
2 自己设计一个加载程序,把该dll加载上来,然后依次调用查找到的所有导出函数。方法是:
21 用LoadLibrary加载dll
22 用GetProcAddress通过函数名把函数地址取出,然后假定函数的原型是void ExFun(void);,调用它。
3 在调试器中设置断点到调用导出函数的语句,F11跟进去。
4 这个时候就比较麻烦了。首先看函数结尾的ret语句有没有带参数。如果ret带参数,那这个函数有可能是stdcall类型的,那么ret的参数通常就是导出函数参数的字节数。如果ret不带参数,那有可能这个函数不带参数,也有可能函数是cdecl类型的。此时无法判断究竟是哪种情况,需要进一步阅读函数汇编码。
5 查看整个函数的汇编码,找出所有类似于"ebp+X"的字样,比如ebp+8, ebp+C等,这些都是参数。ebp+4是返回地址。如果函数是stdcall或cdecl类型的,那么ebp+8是函数第一个参数,ebp+C是第二个。
从上面可以看出,如果函数是stdcall类型,可能比较容易找出函数原型。但如果是cdecl类型的,那就要靠运气了。因为有可能函数有参数,却没有使用。
就算函数是stdcall的,然后取得了字节数,又通过第5步的查找法找到了可能的参数的个数。有一种可能是函数传递了一个结构,假定结构是8字节的,栈地址为ebp+C,那么你有可能找不出ebp+10的引用点,这样你就无法确定函数究竟是使用了一个8字节的结构还是没有使用一个参数,这就无法还原函数原型了。
说了这么多,也表达的挺乱的,其实我想表达的是“还是找一个头文件吧。。。”
C语言中接口和函数其实没什么差别,只是有些人的习惯问题,不过一叫接口的都是针对某一个模块的功能函数集合,像一个采集模块一般就会有三种方式,1、头文件和c文件;2、头文件和so动态库;3、头文件和a静态库。在进行程序编写时我们要添加头文件,在进行编译时,必须加入,该模块的c或so或a,一种就行。
一般我们编写小函数接口,一般需要一个h和一个c就行了。函数的声明都是在h中,实现都在c中,当模块编写c有点大时,我们可以为了编译时的速度,把c文件编译成so和a。
//helloh
#ifndef _HELLO_H_
#define _HELLO_H_
//#define 宏定义也应该在这
#include <stdioh>
void hello();
#endif
//helloc
#inlcude "helloh"
void hello() {
printf("Hello word!");
}
大概就是这样,只不过我是linux下的,函数接口定义大同小异吧
6-1 简单实现x的n次方(10 分)
本题要求实现一个计算x n (n≥0)的函数。
函数接口定义:
double mypow( double x, int n );
函数mypow应返回x的n次幂的值。题目保证结果在双精度范围内。
裁判测试程序样例:
输入样例:
输出样例:
程序源码
6-2 使用函数求1到10的阶乘和(10 分)
本题要求实现一个计算非负整数阶乘的简单函数,使得可以利用该函数,计算1!+2!+⋯+10!的值。
函数接口定义:
double fact( int n );
其中n是用户传入的参数,其值不超过10。如果n是非负整数,则该函数必须返回n的阶乘。
裁判测试程序样例:
输入样例:
输出样例:
程序源码
7-1 生成3的乘方表(15 分)
输入一个非负整数n,生成一张3的乘方表,输出3 0 ~3 n
的值。可调用幂函数计算3的乘方。
输入格式:
输入在一行中给出一个非负整数n。
输出格式:
按照幂的递增顺序输出n+1行,每行格式为“pow(3,i) = 3的i次幂的值”。题目保证输出数据不超过长整型整数的范围。
输入样例:
输出样例:
程序源码
7-2 求平方根序列前N项和(15 分)
本题要求编写程序,计算平方根序列√1 +√2+√3+⋯的前N项之和。可包含头文件mathh,并调用sqrt函数求平方根。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
输出样例:
程序源码
7-3 求阶乘序列前N项和(15 分)
本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。
输入格式:
输入在一行中给出一个不超过12的正整数N。
输出格式:
在一行中输出整数结果。
输入样例:
输出样例:
程序源码
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)