zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念详解编程语言

2023-06-13 09:20:45 时间
说起来好像很啰嗦,但是如果有人告诉你 通过sin(x) 计算后, x的值被改变了,你不会觉得异常奇怪么
函数式编程最重要的基础是λ演算,而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
我们只需要知道λ演算是一种形式的匿名函数,并且接收一个参数作为输入 (可以柯里化进行参数转换多参数函数转换为单参数)
一等公民或者一等类型的含义就是指可以跟值一样的地位,作为参数传递或者存储于变量中 
高阶函数是指可以用另一个函数(间接地,用一个表达式) 作为其输入参数,比如 f(g(x))=g(x)+1 的形式
副作用是指在运算过程中,修改了函数内部局部变量以外的其他变量的状态,比如你修改了类成员变量
List Student 男List ; 

for(int i=0;i studentList.length;i++){//studentList 为学生列表,其中有男有女 

if(studentList[i].性别 == 男){ 

    男List.add(List[i]) 

}

 

你循环遍历列表,找到符合条件的学生,然后把他加入另外一个列表,这可能是一种常见的解题思路
SQL查询中,你只是传入通知条件where  sex= 男   ,数据库在自己内部进行了循环,帮我们找出来符合要求的数据
内部循环以及函数调用 也将我们从如何做中解放出来,让我们不再关注数据项循环的细节本身,仅仅关注于此次调用的结果
在如何做的思维下,你还需要思考在每个子任务中,每一个细节是怎么处理的,比如循环中进行条件判断
的确这也是一种行为参数化,但是显然,这段代码还不够简洁纯粹,因为方法的外层还套了一层对象
Java8中的行为参数化,传递的将是更加纯粹的行为,而不再需要借助一个匿名对象的形式,而且,Lambda表达式不会像内部类一样生成一个类

函数式编程的准则是没有副作用不依赖外部的数据,也不改变外部数据的值。 我们知道线程安全的根本在于共享数据,如果没有任何的数据共享,那么很多的并发/线程安全问题都将迎刃而解 所以说这一特性正好满足了多核并行程序设计的需求,所以很显然能够简化并行程序的开发     函数式编程代码简洁 函数式编程大量使用函数,减少了代码的重复,就如同你调用别人的方法一样不是么,一行就得到了结果


既然函数式编程要求函数可以是同值一样的一等公民用于参数化传递,那么必须要有表示函数的类型
所以说:函数式接口,有且仅有一个抽象方法,覆盖Object的public方法不计算在内(如果是覆盖Object的protected那么会计数的) 
public static void main(String[] args){ 

Function String,Boolean function = (String x)- x.equals("true"); 

System.out.println(function.apply("1")); 

System.out.println(function.apply("true")); 

}

 


至此,Java中已经有了用于表示函数的类型了,也就是可以定义一个函数或者返回一个函数,或者把函数当做一个参数值进行传递了
public static void main(String[] args){ 

Function String,Integer function = String::length; 

System.out.println(function.apply("1")); 

System.out.println(function.apply("true")); 

}

 


既然每一种函数类型都需要存在指定形式的函数接口,想要使用Lambda-匿名函数或者方法引用,自然需要定义函数接口
函数类型的说法可能不太准确,函数式接口的抽象方法的签名称为函数描述符 其实说的也都还是方法签名  方法签名唯一的标识了一个函数
每个节点有各自独立的功能目的,根据你的目的(做什么),将各个独立的功能目的节点拼接成一整个的完整的流水线
你不在需要关注内部的细节,Stream通过内部迭代进行数据项的筛选查找,找到符合条件的数据 
想要使用Java进行函数式编程,仅仅使用Lambda表达式是不够的,必须有足够的函数,Lambda表达式只有跟stream一起使用才能显示其真实的威力
Stream不是一种数据结构,是对于数据的一种新的视图,用于数据的计算,提供了一系列的API用于调用
想要使用Stream的一些特性,显然你必须把你的数据集转换生成为Stream,这没有Stream何谈使用?
还是刚才的例子,你经常让同学帮你买东西,那到底买什么?买矿泉水还是买面包?这就是确定行为参数
这就又涉及到绑定行为方法的属性种类  到底是中间的操作(可以继续传递给流水线下一步)  还是结束的终端操作
但是Stream 终归是Stream ,它并不是一种数据结构,不管经过了多少处理,他终归是再次返回到代码中具体的其他数据类型中
有了函数接口  函数拥有了类型也就是可以像值一样作为参数进行传递,作为返回值,或者使用变量进行表示
Stream是Java8 提供的函数式编程的 库函数 预定了一些常用的操作模式,通过Lambda表达式结合使用

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15587.html

cjava