JDK8中的函数式接口了解下

JDK8中的函数式接口了解下,第1张

  最近刚好有空给大家整理下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。

输出格式:

在一行中输出整数结果。

输入样例:

输出样例:

程序源码

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13494942.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存