Java 8 新语法习惯 (更轻松的函数式编程)

  • 日期:08-28
  • 点击:(1308)


8 新语法习惯 (更轻松的函数式编程)

  千锋JAVA开发学院3天前我要分享

作为Java编程语言的开发人员,我们早已习惯于使用命令式编程和面向对象的对象,因为Java从第一个版本开始就支持这些编程方法。但是,在Java8中,我们拥有一组强大的新功能和语法。功能编程已经存在了十多年。与面向对象编程相比,函数式编程更简洁,更具表现力,更不容易出错,并且更易于并行化。因此有必要在Java程序中引入函数特性。函数式编程需要对代码的设计方式进行一些更改。

在学习此内容之前,我们需要将JDK的计算机版本更新为至少8。在本章中,我们将解释什么是命令性,声明性和功能性,以及它们之前的差异和共性。最后,我们将向您展示如何使用声明性思维来超越函数式编程。

势在必行的格式

命令式编程的程序员已经习惯于告诉程序该做什么以及如何做。这是一个简单的例子:

publicclassFindName {

staticListnList=Arrays.asList(Dory,Gill,Zhang San,Zhao Si,Liu Neng,Xie Aircraft);

publicstaticvoidfindName(Listnames){

Booleanfound=FALSE;

For(Stringstring: names){

如果(string.equals){

实测值=真;

打破;

}

}

如果(实测值){

System.out.println(找到赵思);

}否则{

System.out.println(找不到赵思);

}

}

Publicstaticvoidmain(Stringargs){

//TODOAuto-generatedmethodstub

findName(NLIST);

}

}

执行结果:

找到赵思

findName方法首先初始化一个找到的变量,也称为垃圾变量。我们通常随便命名这个变量。接下来,我们返回名称列表并一次循环遍历一个元素。它检查获得的名称是否等于它要查找的值。

如果匹配,则将found变量设置为true并结束控制流。

这是一种命令式编程风格,是我?亲钍煜さ谋喑谈袷健N颐切枰ㄒ宄绦蛑械拿扛霾街瑁旱扛鲈兀冉现担柚帽淞浚约疤鲅贰C罡袷轿颐翘峁┝税踩刂疲夂芎谩A硪环矫妫阈枰鏊械墓ぷ鳌T谛矶嗲榭鱿拢颐强梢约跎俟ぷ髁恳蕴岣咝省?

声明格式

声明性编程意味着我们仍然告诉程序要做什么,但将实现细节留给底层库。我们重写了上面的代码:

publicclassFindNameTwo {

staticListnList=Arrays.asList(Dory,Gill,Zhang San,Zhao Si,Liu Neng,Xie Aircraft);

publicstaticvoidfindName(Listnames){

如果(names.contains(赵四)){

System.out.println(找到赵思);

}否则{

System.out.println(找不到赵思);

}

}

Publicstaticvoidmain(Stringargs){

//TODOAuto-generatedmethodstub

findName(NLIST);

}

}

此版本中没有声明垃圾变量。您也没有精力浪费在集合上,但使用内置的contains方法来完成工作。我们仍然需要告诉程序该做什么 - 检查集合是否包含我们正在寻找的值。但是实现的细节留给了底层方法。在命令式编程中,我们自己控制迭代,程序需要完全按照要求运行。在声明性编程中,只要结果符合预期,我们就不必关心它是如何工作的。花费较少的努力来达到同样的效果。

在声明性编程中思考将简化我们向Java函数编程的过渡。因为函数式编程是建立在声明的基础之上的。

功能格式

虽然函数式编程总是声明性的,但声明性编程并不等同于函数式编程。函数式编程是一种将声明性方法与高阶函数相结合的模式。

Java中的高阶函数

在Java中,我们将对象传递给方法,在方法内创建对象,并从方法返回一个对象。我们也可以对该功能执行相同的操作。也就是说,您可以将函数传递给方法,在方法内创建函数,并从方法返回函数。

在上下文中,方法是类的一部分。但是方法内部的函数是局部函数,不能直接与类和对象相关联。我们定义可以接收,创建或返回函数的函数或方法被视为高阶函数。

功能编程示例

让我们看一个旧格式的例子,逐步构建一个更复杂的程序。

publicclassUseMap {

publicstaticvoidincrementPageVisit(MappageVisits,Stringpage){

如果(!pageVisits.containsKey(页)){

pageVisits.put(页面,0);

}

pageVisits.put(页面,pageVisits.get(页面)+1);

}

Publicstaticvoidmain(Stringargs){

//TODOAuto-generatedmethodstub

MappageVisits=newHashMap;

Stringpage=

incrementPageVisit(pageVisits,页);

incrementPageVisit(pageVisits,页);

的System.out.println(pageVisits.get(页));

}

}

首先要看的是incrementPageVisit方法,它以命令格式编写。其目的是增加给定的页数并将计数存储在Map中。此方法不知道是否存在给定页面的计数。

所以首先检查是否有计数。如果它不存在,则插入0作为页面的计数。然后递增它并将新值存储在Map中。

声明性编程要求我们将这种方法从我们的工作转变为我们的工作。当我们调用incrementPageVisit方法时,我们想要增加计数。这是做什么的。

声明性编程我们应该扫描JDK库,以确定Map接口是否有办法实现我们的目标。事实证明,合并方法可以实现我们的目标。让我们修改incrementPageVisit方法。但在这种情况下,我们没有使用更智能的声明式格式编程;因为merge是一个更高阶的函数。

publicstaticvoidincrementPageVisit(MappageVisits,Stringpage){

pageVisits.merge(页面,1,(属性oldValue,值)-oldValue +值);

}

合并的第一个参数是page:表示应该更新密钥的值。第二个参数是分配给键的初始值,如果Map中不存在,则初始值为1。第三个参数是一个lamb表达式,它将map中此键的值作为参数。并将此参数作为变量传递给第二个参数。这个lamb表达式返回其参数的总和,它实际上是一个递增计数。

将incrementPageVisit中的代码行与上面示例的多行代码进行比较。使用合并编程是函数式编程的一个例子。因此可以看出,理解声明性方法有助于我们理解函数式编程。 (声明方法加上更高阶函数)

总结

在Java程序中使用函数方法和语法有许多好处:代码引入,更富有表现力,更不容易出错,更容易并行,并且通常比面向对象的代码更容易理解。功能编程虽然不那么直观,但可以关注程序实现的目的,而不是程序的实现方式。通过允许底层库来管理执行代码,我们将逐渐理解高阶函数,它们是函数式编程的构建块。

收集报告投诉。