2019独角兽企业重金招聘Python工程师标准>>>

Scala 集成开发环境配置

很多人说Scala的IDE推荐用intellij idea,eclipse对scala插件的支持相对而言没有idea好。这里我保留意见。不过idea确实是一款不错的IDE,但是伟大的祖国的墙让idea的scala插件在线下载变得遥不可及,即使我这个上海50M电信宽带用户也是一样泪流满面。

所以,scala插件去idea插件官网直接下载,用迅雷下很快。地址如下:

需要注意的是,你要选择对应你idea版本的插件。

http://plugins.jetbrains.com/plugin/1347-scala

接下来讲下载好的scala-intellij-bin-2016.2.1.zip插件从本地安装上去。

【File】-【Settings】-【Plugins】-【Install plugin from disk】

点击重启。

现在发现新建项目已经有scala了。

这时候你就可以新建Scala类文件了。

但是有可能你会发现插件刚刚装好,也重启idea了,但是new的菜单里没有Scala Class。这时候,如果你直接用File项强制创建一个*.scala文件,打开这个scala文件时,编辑器会提示“No scala SDK in Module”。

原因是我们本地安装的Scala SDK没有配置到Idea的IDE环境中。你可以点击这个“No scala SDK in Module”一行提示右边的超链接,打开一个导入SDK的的对话框,选择你安装Scala SDK的本地目录即可。之后你会发现再次打开这个scala文件这个提示就没有了,并且新建菜单中也有Scala class了。由于我已经配好,所以没截图,大家自己试试吧。

对于一个更习惯于eclipse一脉各类IDE的人来说,scala IDE(eclipse的衍生品)更适合我。而且一些地方也没有idea粉说得那么不堪。

http://scala-ide.org/

免安装、插件已经都配好,直接用即可。

Scala核心基本概念

上一篇我们直接介绍了一些基本的操作作为开篇,以帮助大家有个直观的印象。本篇着重将scala,这门基于JVM的、完全面向对象的、函数式编程语言的一些基本的、核心的概念做一个介绍。

Scala相较于Java一个最显著的不同是,Scala是真正的函数式编程语言。所以我在此深度递归式地发出“四问“。引出四个基本概念:

什么是函数式编程

只用纯函数来编程。

什么叫纯函数(Pure Funcation)?(也称函数的纯粹性)

没有副作用的函数。

什么叫做副作用(Side Effect)?

副作用是状态的变化

什么是状态的变化(mutation)?

例如:

修改全局变量

抛出异常

IO读写

调用有副作用的函数

也就是说在凡是存在对全局变量修改、会抛异常的、设计IO读写操作的函数调用都不能算作是函数式编程。

函数式编程是一种计算范式,感性地说,函数式编程将计算过程当做是一种数学函数计算求值的过程。避免了改变状态和可变的数据。

从数学函数的角度,我们引入一个概念:

引用透明性,(Referential Transparency),相同的输入总是能够得到相同的输出。

如果f(x)的参数x和函数体都是引用透明的,那么函数f是纯函数。

object Blog2 {def main(args: Array[String]): Unit = {// println("Eclipse for Scala is OK");fn2();}def fn2():Unit={val s1=new StringBuilder("Happy");println("s1 is",s1);val s2=s1.append("BKs");println("s2 is",s2);val s3=s1.append("BKs");println("At last, s1 is",s1);println("At last, s2 is",s2);println("At last, s3 is",s3);}}

即对于相同的一个输入,append方法的返回前后是不一样的。append方法违反了引用透明性。

怎么样确保我们的程序是引用透明的呢?这里引入另一个概念——不变形(immutablity):

为了获得引用透明性,任何值不能发生变化。

三大重要概念或观点

对于函数式编程而言,有三个非常重要的概念,或者说观点:

(1)函数是第一等公民(First-Class Function)

一切都是计算

函数式编程中一切都是表达式,变量是表达式、函数也是表达式

你可以把函数当做一个参数传给另一个函数,也可以吧一个函数作为另一个函数的返回值返回出来;你可以在一个函数体里面定义一个函数。

在编写函数式编程的时候,你用到变量的地方同样可以使用函数。

(2)高阶函数(Higher Order Function)

如果一个函数的输入参数或输出返回值是是另一个函数,这样的函数称为高阶函数。

(3)闭包(Closure)

这是函数式编程的一个非常重要的概念,本文暂不介绍,在本系列的后面会有专门的文章展开介绍。

Scala表达式的求值策略

严格求值(Call by Value):

非严格求值(Call by Name):

惰性求值(Lazy Evaluation):当定义一个表达式的时候,表达式的值不会立即被计算求值,只有当第一次调用这个表达式的时候才回去求值。

递归函数(Recursive Function)

递归在函数式编程中有举足轻重的地位,因为在函数式编程中是没有循环语句的。所有的循环都是用递归来实现的。

但是众所周知,递归有一个缺点——性能问题:递归的层数一深入,容易堆栈溢出。

调优递归,有一种技术叫做尾递归(Tail Recursion)。这里先给个直观的理解,就是我们把函数体内递归调用的语句放在整个函数体的尾部,使得递归返回时正好是上层函数体的尾部,所以从某种程度上说无须保存上层函数体的上下文环境,也就不存在因为递归深度的加深,各层上下文环境保存积累而导致的内存溢出。这部分我将在后续文章介绍函数的时候再做展开。

总结,最后把这个图中的关键词看看自己是否已经了然于心。

上一篇的补充

关于入门的知识,上一篇快速入门一些基本的概念没有罗列,这里做个入门补充。

变量声明

Scala的变量声明有不同的语法,它们可以被定义为值,即,常量或变量。下面是使用var关键字来定义一个变量的语法:

var myVar : String = "happybks"

在这里,myVar使用关键字var声明。这意味着它是一个可以改变值的变量,被称为可变变量。下面是使用val关键字来定义变量的语法:

val myVal : String = "happybks"myVal =myVal +", yeah"

这里,myVal是使用关键字val声明。这意味着,它是不能改变的变量,这是所谓的不可变变量。

当分配一个初始值给一个变量,Scala编译器可以计算出根据分配给它的值的变量类型。这就是所谓的变量类型推断。

    //Scala在声明变量时可以声明变量的类型,但是约束类型之后必须初始化值,否则报错;初始化或赋值的类型不对也会报错。var myVar:Int=10;var myVar2:String="Hello, Scala!";//myVar2=2;//Error:type mismatch;//var myVar3:Int;//ERROR:only classes can have declared but undefined members//变量无论是var还是val,都必须初始化;var之后可以赋值与初始化时同类型性的值,但val不可以再修改变量值//如果生命变量没有指定类型,var变量初始化之后不可以赋其他类型的值var x2=0;//x2="happybks";// Error: type mismatch;

函数的编写:

这里写了一个求最大公约数的函数(当然函数式编程最好用尾递归)。我这里这样用while是想说明,scala不仅是一门纯粹的函数式语言,也同样支持一般主流面向对象高级语言的语法糖。

  def gcd(x: Long, y: Long): Long = {var a = xvar b = ywhile (a != 0) {val temp = aa = b % ab = temp}b}

转载于:https://my.oschina.net/happyBKs/blog/891921

Scala笔记2——IDE配置、函数式编程核心概念相关推荐

  1. Python笔记---一脚踏进函数式编程

    函数式编程 不可变数据结构 三个基本函数 filter() 再做一些练习来熟悉filter() 再做一些思考: map() 再做一些思考: 再再做一些思考: reduce() 再次注意的是: 小结: ...

  2. 干货推荐|Java并发编程核心概念一览,面试必备!

    本文由读者 muggle 投稿,muggle 是一位具备极客精神的 90 后单身老实猿,对 Java 并发编程有着深入研究,本文较长,大伙认真读完一定会有所收获.muggle 个人博客地址是 http ...

  3. Apollo(分布式配置中心)核心概念及核心功能介绍

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 服 ...

  4. Python实用笔记 (16)函数式编程——偏函数

    假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去: def int2(x, base=2): re ...

  5. 【读书笔记】《JS函数式编程指南》(一)

    纯函数 纯函数:函数的返回值由传入的参数决定,即相同的参数返回相同的结果. slice和splice,表现作用相似. slice浅复制,返回复制之后的数组 splice删除数组元素,返回删除元素 sl ...

  6. scala函数式编程_想要开始进行函数式编程,请进入scala

    scala函数式编程 意见 (Opinion) If you haven't used Scala yet, you're not the only one: Not even four percen ...

  7. 阅读笔记–Java 8函数式编程,建议看书,作者高屋建瓴

    阅读笔记–Java 8函数式编程 书籍代码 为什么需要再次修改Java 1996年1月,Java1.0发布,商业发展需要更复杂的应用,跑在功能强大的多核CPU机器上.带有高效运行时编译器的Java虚拟 ...

  8. Scala的函数式编程

    为什么80%的码农都做不了架构师?>>>    Scala的函数式编程 昨天去一家公司面试,额,他们想招erlang的开发人员,然后我会点scala,都是函数式语言么.所以就让我过去 ...

  9. 廖雪峰--python教程:笔记四-函数式编程

    函数式编程: 概念:是一种抽象程度很高的编程方式,允许将一个函数作为参数传入另一个函数,还允许返回一个函数. 接下来介绍: map/reduce,filter,stored函数,返回函数,匿名函数,装 ...

  10. 现代C++函数式编程

    作者简介: 祁宇,武汉烽火云创软件技术有限公司研发中心技术总监,<深入应用C++11>作者,C++开源社区purecpp.org创始人,致力于C++11的应用.研究和推广.乐于研究和分享技 ...

最新文章

  1. 2018-2020年Gartner战略科技发展趋势一览!
  2. 小五:从个人用户无法注册.CN域名说起
  3. 熟悉常用的HBase操作,编写MapReduce作业
  4. 【题解】lugu P4095 Eden的新背包问题
  5. 如何在SAP C4C里使用ABSL消费第三方Restful API
  6. Magicodes.IE之导入学生数据教程
  7. powerdesigner15(pd)+Oracle 11g 开发小问题
  8. 实验5.3 编程实现两字符串的连接(使用字符数组)
  9. vue axios的路由拦截器
  10. WingPro 8 for Mac(专业Python IDE开发工具)
  11. 完美卸载SQL Server 2008的方案
  12. java multipy_python multi-thread multi-process
  13. 海康硬盘录像机管理员密码初始化方法
  14. 在原生开发中控制HTML5视频
  15. Kibana启动常见报错信息的解决方案
  16. 化妆品行业电商平台系统解决方案
  17. 人工智能 2.知识表示
  18. Python如何根据日期判断周几
  19. 新手追高,熟手突破,老手抄底,高手回撤,庄家筹码,机构算法!
  20. JPA 6.JPQL

热门文章

  1. UITableViewCell delete button 上有其它覆盖层
  2. IE浏览器中a:hover设置background失效的解决方法
  3. 如何改变Delphi的快捷键 - DELPHI
  4. SendMessage,PostMessage
  5. [转]纯JS实现出生日期[年月日]下拉菜单
  6. nosql数据库基础
  7. 可配置语法分析器开发纪事(二)——构造符号表
  8. Jim Marino与Meeraj Kunnumpurath专访:关于SCA和Fabric3
  9. 指示函数和sign函数(符号函数)
  10. ubuntu 17.10.1 安装 virtual box 增强工具