什么是函数式编程
在介绍函数型编程之前,让我们先了解一下我们平时使用的指令型编程。 指令式编程是教计算机如何一步一步地执行编程风格。
例如,从一个苹果对象集合中筛选颜色为红色的苹果集合。 你需要写下面的代码。
创建保存苹果的集合list
遍历此收藏
判断苹果的颜色是否为红色,如果满足条件的话添加到结果集合中
publicstaticlistgetredappledeclarative {
列表结果=new ArrayList (;
苹果:苹果(for ) {
if(red ).equals(apple.getcolor ) ) ) ) ) ) ) )。
results.add(apple;
}
}
返回结果;
}
函数式编程是如何操作的呢? 函数式编程类似于sql语句
select * from table where条件语句
你想要什么,然后只宣布条件就行了
publicstaticlistgetredapplefunctional (列表应用程序) {
returnapples.stream((.filter ) apple-' red '.equals (apple.getcolor ) ).collect (collectors.to list ) ) )
}
可见函数式编程大大简化了代码语句。 另外,如果熟悉函数类型结构,就能很快知道这段代码的含义。stream将apples集合流-过滤器过滤满足的条件-collect转换为列表输出
比起繁琐的指令式代码,我们的函数式编程可以让代码瞬间充满清新的学院风。 当然,马上学习,为下一个b的需要做准备吧。
通过与数学函数的对比加深对函数编程的理解
数学中函数思想是众所周知的。 例如,根据输入x求出的y值,用数学函数表示以y=f(x )=x 10、x为输入,以x 10为结果
在java函数式编程样式中
函数函数=(x )-{return x 10; (;
具体调用:
公共统计函数计算(功能功能) {
returnfunction.apply(10;
}
publicstaticvoidmain (字符串[ ] args ) {
函数函数=(x )-{return x 10; (;
整数结果=计算(功能);
}
在上面的代码中,main函数显示我们定义的function是数学函数f(x )。 将定义的函数传递给方法caculate。 在caculate中,function.apply ) 10 )相当于调用了数学函数f ) 10 )。
lambda公式
上面的Function接口表示数据函数f(x )=x 10。 此函数是lambda表达式,lamdba表达式由参数箭头和主体组成,基本语法为: )参数-表示语句
使用lamdba的好处非常直观,程序员的意图清楚地体现在lambda公式中。
java8为lambda提供了功能包,并提供了lambda接口。 例如,上面的函数接口定义如下
@ functional接口
公共接口功能{
//*
* appliesthisfunctiontothegivenargument
*
* @param t the function argument
* @return the function result
*/
rapply(tt );
功能支持(defaultfunctioncompose? 扩展t before ) {
objects.requirenonnull(before );
返回(v ) -应用(before.apply ) v );
}
.
}
在Function接口中,除了用default限定的方法外,接口中只有一个方法apply。 这也是使用lambda接口所必需的。 他表示将给出输入t,并返回输出r。如果使用lamdba接口,他将使用表达式来表示实现接口的唯一方法apply ()
函数函数=(x )-{
system.out.println(x: ) string.valueof ) x );
返回x 10;
(;
lambda表达式的另一个表示形式是lambda方法引用。
在lambda方法引用描述符:3360中区分分类和方法的:3360前是类名; 后面是方法,但不加括号
//lamdba
predicateq={stringa}-{
return a.isEmpty (;
(;
如果用方法的引用表示:
predicate p=string :3360 isempty;
具体调用:
公共类lambda test {
publicstaticvoidlambdafunc (consumer consumer,Predicate predicate,字符串测试) {
boolean condition=predicate.test (' ';
if(condition ) {
consumer.accept(test;
}
}
publicstaticvoidmain (字符串[ ] args ) {
predicate p=string :3360 isempty;
consumer c=system.out :3360 println;
lambdafunc(c,p,' test ' );
}
}
上面的代码表示如果方法参数test不为空,则打印
lambda引用还包括替代函数类型接口和构造函数引用
代替函数型接口:
示例1 :
listtestlist=Arrays.aslist('a '、' b '、' a '、' b ' );
//testlist.sort((S1,s2 )-S1.comparetoignorecase ) ) s2 );
test list.sort (string :3360比较to ignore case;
system.out.println (测试列表);
示例2 :
publicstaticvoidmain (字符串[ ] args ) {
//functionF1=(stringa(-) returninteger.valueof ) a; (;
function F2=integer :3360 value of;
集成结果=F2.apply ('2);
system.out.println(result );
}
函数的泛型字符串表示返回类型,Integer表示输入类型,lambda引用根据泛型进行类型估计。
构造函数引用:
//方法引用的构造函数引用
public void构造队列(
//Supplier s1=() -新队列类);
suppliers2=quote class 33603360 new;
}
示例中Supplier返回泛型类的实例。
以上是函数型编程和lambda的介绍,接下来对java的stream进行分析。 下面介绍其中涉及的许多函数型编程的使用。