2 minutes
Object-Oriented Meets Functional
2017年03月01日
当面向对象遇到函数式
—— 借JVM上位的Scala
写这篇Blog的主要目地是想从自己的角度介绍一下Scala这门语言,以及从多个方面零散的与Java对比着介绍一下这个作为一门同样是运行在JVM上语言。
因为时间问题,写的比较粗略,请各位看官见谅。
》写在前面
#######i关于标题与副标题
- Object-Oriented Meets Functional:这个标题取自Scala的官网(如下图)。个人认为这是对Scala一针见血的阐述,也是Martin Odersky对Scala的期望
- 借JVM上位的Scala:我对它的第一印象,可能就这是一门借JVM上位的语言,这符合我对它的第一看法。
- Object-Oriented Meets Functional:这个标题取自Scala的官网(如下图)。个人认为这是对Scala一针见血的阐述,也是Martin Odersky对Scala的期望
#######关于作者和这篇Blog
- 作为一名战斗在一线搬砖猿,喜欢Java的健壮稳定,Python的方便迅速,JS的灵活多变。如果有一种语言可以结合这些特性,那我愿意分一点感情给它。
- Scala这门语言呢,函数式,面向对象,自动推导,高阶函数,等等高级特性,十分性感。
- 说说Scala与Java,从一个Javaer的角度去理性的感知一下这个语言。
》介绍一下Scala
- Scala是一门运行在JVM上的语言,联邦理工学院洛桑(EPFL)的Martin Odersky设计了这门语言,2003开始放到JVM跑,现在的最新版是2.12。
- 能用Java库,比Java简洁,开发速度快,无缝集成已有的Java类库。
- 交互式命令行(REPL),可在上面快速实验各种语法和代码(Java9也有)。
- 融合了静态类型系统、面向对象、函数式编程等语言特性.
- 支持高阶函数,Lambda等等各种特性。
- 有着spark、kafka、akka这样的开源项目
》函数式与面向对象
- 什么是函数式
- 函数式编程一句半句话可能说不清楚,与Java(面向对象)相比,最直观的感受可能就是,在Java中,讲究万事万物皆对象,也就是说,对象,是Java里的一等公民。以这个为前提,在函数式中,函数是一等公民,所有的东西都可以用函数来表示,函数也可以做为参数来传递,就像Java传递对象那样传递。
- 可变与不可变的思考
- 在Java中,或者说我们现在的编程方式中,变量是必不可少的一种东西,如果是在严格的函数式语言环境下,是没有变量这一说的,简单的理解,就是任何一个值都可以用一个函数来表示,即被计算出来。
- 循环与递归
- 平时,我们可能更多的去使用循环,因为在我们的印象中可能循环更直观,更省资源一些,而在函数式中,递归才是王道,还有尾递归,懒性求值这些强大东西。
- 总之
- And more.
- And more.
》对较一下Hello World
接下来,我们从HelloWorld直观的感受一下,这个同样跑在JVM上的语言。
Java Hello World
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
Scala Hello World
object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
Simple Scala Hello World
object HelloWorld extends App { println("Hello, world!") }
看一下是不是跟Java很像,是的,很像!!!这是一个运行在JVM上又对Javaer友好的语言,让你一开始不会有陌生感。
》Scala与Java无缝结合
比较完HelloWorld,我们再来看看Java与Scala的无缝结合,这里用一个Scala的类实现Java的Comparable
,Java代码调用Scala类的伴生类的方法(相当于Java里的静态方法),来展示一下Java与Scala的无缝结合度。 Scala代码
class Author(val firstName: String, val lastName: String) extends Comparable[Author] { override def compareTo(that: Author) = { val lastNameComp = this.lastName compareTo that.lastName if (lastNameComp != 0) lastNameComp else this.firstName compareTo that.firstName } } object Author { def loadAuthorsFromFile(file: java.io.File): List[Author] = ??? }
Java代码
import static scala.collection.JavaConversions.asJavaCollection; public class App { public List<Author> loadAuthorsFromFile(File file) { return new ArrayList<Author>(asJavaCollection( Author.loadAuthorsFromFile(file))); } public void sortAuthors(List<Author> authors) { Collections.sort(authors); } public void displaySortedAuthors(File file) { List<Author> authors = loadAuthorsFromFile(file); sortAuthors(authors); for (Author author : authors) { System.out.println( author.lastName() + ", " + author.firstName()); } } }
与Java的无缝结合,也就是意味着,它一出生,便继承了Java发展了这么多年的庞大的类库基础,不仅享用了JVM,还享用了JVM上类库最多的Java的类库。
》关于Lambda表达式Java 8与Scala的较量
- Java8增加了Lambda表达式等一些偏函数式的内容,从一个方面来说,这是Java的进步,有一些人可能会觉得,Scala只是多了函数式的语法糖,那么Java8也有了这些语法糖之后Scala是不是就可以放弃了。
- 当然了,我并不认为Scala只是Java的语法糖版,Scala从诞生开始就是一门函数式语言,把面向对象和函数式范式完美的融合到了一起,说函数式,是比Java8要优越的。
先看看Java8带来的全新的Lambda
//在Java 8之前 Runnable r = new Runnable(){ public void run(){ System.out.println(“This should be run in another thread”); } }; //Java 8 Runnable r = () -> System.out.println(“This should be run in another thread”);
再然后,我们看看Java与Scala如何创建一个函数。
//Java 8 Function parseInt = s -> Integer.parseInt(s); //Scala val parseInt = (s: String) => s.toInt //or val parseInt:String => Int = s => s.toInt //or val parseInt:Function1[String, Int] = s => s.toInt
然后我们来看看实现两样的东西Java与Scala的区别。
//Scala Future(println{“This should be run in another thread”}) //Java 8 Runnable r = () -> System.out.println(“This should be run in another thread”); executorService.submit(r);
可以有种感受,因为Java已经发展了很多年了,在加东西之前,都要考虑到这些年来Java的所有的一切,Java受的长期历史的影响,函数式来说还是有一些局限性的,不过,Java已经做的很好了。而Scala来说,则没有任何包袱,因为这是一门新的语言,从一开始,它就是函数式的。
》看看Scala技术栈
- 这个话题,敬请期待
》从Java技术栈转换到Scala技术栈
- 说实话,这个话题,不是敬请期待,我是完全还没想好,这也是对切换Scala栈的热情最大的阻力,从Java到Scala,从框架到工具,从持久化、HTTP、Web、Spring到Dubbo或是其他的分布式调用,基本都要换一遍,看起来代价好像有些大,或者是Scala只是作为一个用来写写对内部系统没有强依赖的环境下的一些小的东西。
- 取舍,真难。
》And More? OR 写在最后
- Scala是一门值的学习的语言,不管是从函数式还是什么。随手一写,不成体系,各位看客也随意一看,当做闲看就好。
- 路长道远,沉志静心。
- 愿大家都能在技术路上找到自己的愿景。
291 Words
2017-03-01 08:00 +0800