课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java8函数式编程语言介绍
  • Java8函数式编程语言介绍

    发布:昆明Java培训      来源:达内新闻      时间:2016-02-28

  • java8 函数式编程语言的核心是它以处理数据的方式处理代码。这意味着函数应该是第一等级(First-class)的值,并且能够被赋值给变量,传递给函数等等。

    事实上,很多函数式语言比这走得更远,将计算和算法看得比它们操作的数据更重要。其中有些语言想分离程序状态和函数( 以一种看起来有点对立的方式,使用面向对象的语言,这通常会将它们联系得更紧密)

    Clojure编程语言就是一个这样的例子,尽管它运行于基于类的Java虚拟机,Clojure 的本质是函数式语言,并且在高级语言源程序中不直接公布类和对象(尽管提供了与Java良好的互操作性)

    下面显示的是一个Clojure函数,用于处理日志,是一等公民(First-class citizen),并且不需要绑定一个类而存在。

    (defn build-map-http-entries [log-file]

    (group-by :uri (scan-log-for-http-entries log-file)))

    当写在函数中的程序,对给定的输入(不论程序中的其它状态如何) 总是返回相同的输出,并且不会产生其它影响,或者改变任何程序状态,这时候函数式编程是最有用的。它们的行为与数学函数相同,有时候把遵循这个标准的函数称为“纯”函数。

    纯函数的巨大好处是它们更容易推论,因为它们的操作不依赖于外部状态。函数能够很容易地结合在一起,这在开发者工作流风格中很常见,例如Lisp 方言和其它具有强函数传统的语言中很普遍的 REPL(Read, Execute, Print, Loop)风格。

    非函数式编程语言中的函数式编程

    一种语言是不是函数式并不是非此即彼的状态,实际上,语言存在于图谱上。在最末端,基本上是强制函数式编程,通常禁止可变的数据结构。Clojure 就是一种不接受可变数据的语言。

    不过,也有一些其它语言,通常以函数方式编程,但语言并不强制这一点。Scala就是一个例子,它混和了面向对象和函数式语言。允许函数作为值,例如:

    val sqFn = (x: Int) => x * x

    同时保留与Java非常接近的类和对象语法。

    另一个极端,当然,使用完全非函数式语言进行函数式编程是可能的,例如C语言,只要维持好合适的程序员准则和惯例。

    考虑到这一点,函数式编程应该被看作是有两个因素的函数,其中一个与编程语言相关,另一个是用该语言编写的程序:

    1)底层编程语言在多大程度上支持,或者强制函数式编程?

    2)这个特定的程序如何使用语言提供的函数式特性?它是否避免了非函数式特性,例如可变状态?

    Java的一些历史

    Java 是一种固执己见的语言,它具有很好的可读性,初级程序员很容易上手,具有长期稳定性和可支持性。但这些设计决定也付出了一定的代价:冗长的代码,类型系统与其它语言相比显得缺乏弹性。

    然而,Java的类型系统已经在演化,虽然在语言的历史当中相对比较慢。我们来看看这些年来它的一些形式。

    Java最初的类型系统

    Java最初的类型系统至今已经超过15 年了。它简单而清晰,类型包括引用类型和基本类型。类、接口或者数组属于引用类型。

    类是Java平台的核心,类是Java平台将会加载、或链接的功能的基本单位,所有要执行的代码都必须驻留于一个类中。

    接口不能直接实例化,而是要通过一个实现了接口API的类。

    数组可以包含基本类型、类的实例或者其它数组。

    基本类型全部由平台定义,程序员不能定义新的基本类型。

    从最早开始,Java的类型系统一直坚持很重要的一点,每一种类型都必须有一个可以被引用的名字。这被称为“标明类型(Nominative typing)”,Java 是一种强标明类型语言。

    即使是所谓的“匿名内部类”也仍然有类型,程序员必须能引用它们,才能实现那些接口类型:

    Runnable r = new Runnable() { public void run() { System.out.println("Hello World!"); } };

    换种说法,Java中的每个值要么是基本类型,要么是某个类的实例。

    命名类型(Named Type)的其它选择

    其它语言没有这么迷恋命名类型。例如,Java没有这样的Scala概念,一个实现(特定签名的)特定方法的类型。在Scala 中,可以这样写:

    x : {def bar : String}

    记住,Scala在右侧标示变量类型(冒号后面),所以这读起来像是“x是一种类型,它有一个方法bar返回String ”。我们能用它来定义类似这样的Scala方法:

    def showRefine(x : {def bar : String}) = { print(x.bar) }

    然后,如果我们定义一个合适的Scala对象:

    object barBell { def bar = "Bell" }

    然后调用showRefine(barBell),这就是我们期待的事:

    showRefine(barBell) Bell

    这是一个精化类型(Refinement typing)的例子。从动态语言转过来的程序员可能熟悉“鸭子类型(Duck typing)”。结构精化类型(Structural refinement typing)是类似的,除了鸭子类型(如果它走起来像鸭子,叫起来像鸭子,就可以把它当作鸭子)是运行时类型,而这些结构精化类型作用于编译时。

    在完全支持结构精化类型的语言中,这些精化类型可以用在程序员可能期望的任何地方,例如方法参数的类型。而Java,相反地,不支持这样的类型( 除了几个稍微怪异的边缘例子)

     

    推荐文章

上一篇:奋斗不止——非凡人生

下一篇:Java 5类型系统

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56