当前位置: 首页 > 编程日记 > 正文

spark之scala快速入门

scala和java都是在jvm之上的语言,相对来讲,scala热度比较低,其实并不是一个特别好的语言选择。

原因倒不是因为scala本身的缺点,而是使用人群不够多,论坛和社区不够活跃。这就跟社交软件一样,大家都用微信,短信就没人用了。

但是scala是写分布式程序的一门非常方便的语言,因为scala几乎每个对象都有map,reduce,filter等方法,这跟spark的用法简直如出一辙。

多范式

scala是一种多范式的语言,这也没啥特别的,就是既能面向过程又能面向对象,比如C++就是多范式。

安装

装scala要先装java,再装scala。

交互式编程

scala支持像javascript那种交互式编程,在命令行输入scala,进入交互式编程控制台。

编译

scalac 约等于 javac

打包和引包

打包有两种,第一种和java一样,在首行用package关键字。先掌握这种就行了。

引包也是用import但功能比java要强大,可以在代码任意位置引。

import java.awt.{Color, Font}// 重命名成员
import java.util.{HashMap => JavaHashMap}// 隐藏成员
import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了

默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._,这里也能解释,为什么以scala开头的包,在使用时都是省去scala.的。

数据类型

scala多了几种比较傻又还是有点用的数据类型:

Unit 类似于void

Null 等于null

Nothing 是所有类的子类

Any 约等于 Object

常量和变量声明

常量: val x:String ="a";

变量  var x:String ="a";

访问修饰符

private ,protect,public default是public。有一些些区别,比如可灵活指定范围 private[ClassA]表示ClassA能访问。

运算符

基本运算符完全一致,不用特地去看。

针对集合或者是特殊对象有一些运算符,如List中(::,:::),Set中(&,++)等,运算符也可以作为方法使用。

if...else

完全一致,不用特地去看。

循环

终止循环。scala不支持break和continue关键字,scala2.8之后加入了 Breaks类,使用如下写法:

// 导入以下包
import scala.util.control._// 创建 Breaks 对象
val loop = new Breaks;// 在 breakable 中循环
loop.breakable{// 循环for(...){....// 循环中断loop.break;}
}

for循环比较好用,java感觉也是借鉴了该思想:

//1到10
for( var x <-  1 to 10 ){statement(s);
}//1到9
for( var x <-  1 until 10 ){statement(s);
}//双循环,java里面需要两个for
for( a <- 1 to 3; b <- 1 to 3){println( "Value of a: " + a );println( "Value of b: " + b );}//集合
for(x<- List)
{
}//循环过滤 感觉不需要掌握,放在循环体内也可以。for( a <- numListif a != 3; if a < 8 ){println( "Value of a: " + a );}//yield  注意for后面是大括号 用于返回满足条件的所有a集合里面的值,生成新集合var retVal = for{ a <- numList if a != 3; if a < 8}yield a

方法声明

在java中是先声明出参再声明入参,scala正好相反。只是思维方式不一样。

object add{def addInt( a:Int, b:Int ) : Int = { var sum:Int = 0 sum = a + b return sum } }

函数声明

函数是scala函数式编程的重点,会在下一篇文章中重点介绍。

字符串

scala字符串是不能更新的所以对字符串变量的修改会在内存区域创建一个新的字符串对象,如果需要更新,可以用StringBuilder这个对象。

集合:

scala集合包括java中常见的那些集合(List,Set,Map),以及元组,与java不同的是,scala中的集合一般是不可变集合,修改集合的实现是创建一个新的集合。

链表(List)

列表的元素类型 T 可以写成 List[T]。

构造列表的两个基本单位是 Nil 和 ::  。 Nil 也可以表示为一个空列表。

scala的类java构造数组办法。

// 字符串列表
val site: List[String] = List("Runoob", "Google", "Baidu")// 整型列表
val nums: List[Int] = List(1, 2, 3, 4)// 空列表
val empty: List[Nothing] = List()// 二维列表
val dim: List[List[Int]] =List(List(1, 0, 0),List(0, 1, 0),List(0, 0, 1))

scala特有的构造办法如下:

// 字符串列表
val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil))// 整型列表
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))// 空列表
val empty = Nil// 二维列表
val dim = (1 :: (0 :: (0 :: Nil))) ::(0 :: (1 :: (0 :: Nil))) ::(0 :: (0 :: (1 :: Nil))) :: Nil

连接列表的操作

你可以使用 ::: 运算符或 List.:::() 方法或 List.concat() 方法来连接两个或多个列表。实例如下:

object Test {def main(args: Array[String]) {val site1 = "Runoob" :: ("Google" :: ("Baidu" :: Nil))val site2 = "Facebook" :: ("Taobao" :: Nil)// 使用 ::: 运算符var fruit = site1 ::: site2println( "site1 ::: site2 : " + fruit )// 使用 List.:::() 方法fruit = site1.:::(site2)println( "site1.:::(site2) : " + fruit )// 使用 concat 方法fruit = List.concat(site1, site2)println( "List.concat(site1, site2) : " + fruit  )}
}

集合(Set)

可变集合和不可变集合。 虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。 而对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。

import scala.collection.mutable.Set // 可以在任何地方引入 可变集合

val mutableSet = Set(1,2,3)
println(mutableSet.getClass.getName) // scala.collection.mutable.HashSet

mutableSet.add(4)
mutableSet.remove(1)
mutableSet += 5
mutableSet -= 2println(mutableSet) // Set(5, 3, 4)

val another = mutableSet.toSet
println(another.getClass.getName) // scala.collection.immutable.Set

你可以使用 ++ 运算符或 Set.++() 方法来连接两个集合。如果元素有重复的就会移除重复的元素。实例如下:

object Test {def main(args: Array[String]) {val site1 = Set("Runoob", "Google", "Baidu")val site2 = Set("Faceboook", "Taobao")// ++ 作为运算符使用var site = site1 ++ site2println( "site1 ++ site2 : " + site )//  ++ 作为方法使用site = site1.++(site2)println( "site1.++(site2) : " + site )}
}

映射(Map)

默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map 类

// 空哈希表,键为字符串,值为整型
var A:Map[Char,Int] = Map()// Map 键值对演示
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

注意,Map的get方法返回的对象是一个Option[String],Option表示可能为None,比如key值不存在的情况,如果不为None则是Some(value)。

Scala元组(Tuple)

元组是每个元素类型可以不一样的List,最大的size是22。

val t = (1, 3.14, "Fred")  
val t = new Tuple3(1, 3.14, "Fred")//3是元组中元素的个数

我们可以使用 t._1 访问第一个元素, t._2 访问第二个元素,如下所示:

object Test {def main(args: Array[String]) {val t = (4,3,2,1)val sum = t._1 + t._2 + t._3 + t._4println( "元素之和为: "  + sum )}
}

类(class)

scala的类和对象与java的类和对象基本上一样。

类定义方法如下:

class Point(xc: Int, yc: Int) {var x: Int = xcvar y: Int = ycdef move(dx: Int, dy: Int) {x = x + dxy = y + dyprintln ("x 的坐标点: " + x);println ("y 的坐标点: " + y);}
}

对象的定义方法是用object关键字,和java以class名.java 命名文件不同,scala是以类名.scala命名文件。

接口(trait)

trait关键字很像java的interface,但是它能够定义某个方法的实现。

trait Equal {def isEqual(x: Any): Booleandef isNotEqual(x: Any): Boolean = !isEqual(x)
}

和java一样,scala只能继承一个父类,但如果是trait就可以继承多个,继承的关键字是extends

模式匹配

scala的 x match{case:...} 对应java中的switch(x){case:...}

捕获异常

scala的异常捕获和java大致一致,只是在catch的时候使用了模式匹配的思想。

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOExceptionobject Test {def main(args: Array[String]) {try {val f = new FileReader("input.txt")} catch {case ex: FileNotFoundException => {println("Missing file exception")}case ex: IOException => {println("IO Exception")}} finally {println("Exiting finally...")}}
}

提取器:apply和unapply

提取器是从传递给它的对象中提取出构造该对象的参数。感觉这个玩意很鸡肋。

object Test {def main(args: Array[String]) {//下面调用applyval x = Test(5)println(x)x match{//下面unapply 被调用case Test(num) => println(x + " 是 " + num + " 的两倍!")case _ => println("无法计算")}}def apply(x: Int) = x*2def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

文件IO

scala写文件操作直接用的是java的io,读操作有自己的,总体来讲比java简单。

import java.io._object Test {def main(args: Array[String]) {val writer = new PrintWriter(new File("test.txt" ))writer.write("菜鸟教程")writer.close()}
}

从屏幕读输入

import scala.io._
object Test {def main(args: Array[String]) {print("请输入菜鸟教程官网 : " )
//2.11版本后。Console.readLine已废弃val line = StdIn.readLine()println("谢谢,你输入的是: " + line)}
}

从文件中读内容

import scala.io.Sourceobject Test {def main(args: Array[String]) {println("文件内容为:" )Source.fromFile("test.txt" ).foreach{ print }}
}

转载于:https://www.cnblogs.com/arli/p/9335679.html

相关文章:

python 归一化_只需 45 秒,Python 给故宫画一组手绘图!

作者 | 丁彦军责编 | 伍杏玲13日早晨&#xff0c;当北京市民拉开窗帘时发现&#xff0c;窗外雪花纷纷扬扬在空中飘落&#xff0c;而且越下越大&#xff0c;树上、草地、屋顶、道路上&#xff0c;都落满雪花。京城银装素裹&#xff0c;这是今冬以来北京迎来的第二场降雪。一下雪…

Windows平台下程序打包流程

Windows平台下程序打包流程 1、所有测试完成之后、程序release编译完成 2、依赖库打包 执行deploy.bat 脚本打包最新的程序以及依赖库 3、可执行程序打包 打开打包工程文件.evb&#xff0c; 使用 enigma virtual Box 打包可执行程序 点击“执行封包”&#xff0c;开始打包 …

一个apk多个ICON执行入口

一个工程对应一个AndroidManifest.xml文件&#xff0c;这个文件中包含有该项目的一些设置&#xff0c;如权限、SDk版Activity、Service信息等。一般而言&#xff0c;这个文件中会有且仅有一个application节点&#xff0c;这个节点表示这是一个应用程序&#xff0c;不管它下面还…

vbs之CurrentDirectory

为什么80%的码农都做不了架构师&#xff1f;>>> 最近要用一下Oracle instantclient的ODBC&#xff0c;由于配置有点繁琐&#xff0c;于是打算用vbs写一脚本来自动化一下&#xff0c;刚开始是这样的&#xff1a; Set ws CreateObject("WScript.Shell") w…

详解javascript: void(0);

原文 简书原文&#xff1a;https://www.jianshu.com/p/08ae8cbeb3be 什么是javascript: void(0); 我们经常会使用到 javascript:void(0) 这样的代码&#xff0c;那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢&#xff1f;  javascript:void(0) 中最关键的是 v…

读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

读书笔记&#xff1a;编写高质量代码--web前端开发修炼之道 这本书看得断断续续&#xff0c;不连贯&#xff0c;笔记也是有些马虎了&#xff0c;想了解这本书内容的童鞋可以借鉴我的这篇笔记&#xff0c;希望对大家有帮助。 笔记有点长&#xff0c;所以分为一&#xff0c;二两个…

# Qt程序版本号使用

Qt程序版本号使用 在pro文件中添加&#xff08;版本号可以3段或者4段&#xff09; VERSION1.0.1.2DEFINES APP_VERSION\\\"$${VERSION}\\\"实际代码中使用 QString version APP_VERSION;qInfo()<<"版本信息:"<< version;

python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题

安装了pytest后&#xff0c;运行了一下&#xff0c;看不懂了&#xff0c;不过你前面的说对了 Testing started at 10:15 ... C:\Users\Administrator\PycharmProjects\untitled4\venv\Scripts\python.exe "D:\Program Files (x86)\PyCharm Community Edition 2018.2.4\hel…

Directx11教程(6) 画一个简单的三角形(2)

在上篇教程中&#xff0c;我们实现了在D3D11中画一个简单的三角形&#xff0c;但是&#xff0c;当我们改变窗口大小时候&#xff0c;三角形形状却随着窗口高宽比例改变而改变&#xff0c;如下图所示&#xff1a; 这是因为我们改变了窗口大小&#xff0c;但后缓冲大小在程序初始…

【单调栈 前缀和 异或】7.21序列求和

还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题。她定义一个区间的价值是max(ai)(l<i<r)∗(alxoral1xor...xorar)max(ai)(l<i<r)∗(alxoral1xor...xorar)她想要知道&#xff0c;一个序列所有的连续子序列价值之和是多少。 输入格式 第一行一…

hibernate 复合主键 根据主键删除_hibernate封装Utils工具类

一&#xff1a;封装Session对象1、获取全新的Session的对象 2、获取与线程绑定的的Session的对象二&#xff1a;什么是持久化类1、Hlbernate是持久层的ORM映射框架&#xff0c;专注于数据的持久化工作。所谓的持久化&#xff0c;就是将内存中的数据永久存储到关系型数据库中。 …

Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

LinuxQt 下同一数据空间vfork多进程间通信的一种高效便捷方式&#xff08;信号槽直接调用&#xff09; 概述 传统的多进程间通信往往非常麻烦&#xff0c;采用的方法比如管道&#xff0c;共享内存&#xff0c;socket&#xff0c;文件等&#xff0c;大都非常繁琐&#xff0c; …

Eclipse 调试器(引用IT168)

Eclipse 调试器&#xff1a;零距离接触实战技巧 2011年11月25日01:29IT168字号&#xff1a;T|T调试的方法虽然千千万万&#xff0c;但归根结底&#xff0c;就是找到引发错误的代码。Eclipse调试器的目标是让程序员能对本地或远程程序进行错误侦测与诊断。该调试器提供所有标准调…

Cisco交换机与路由器的密码恢复_路由交换

站长原创&#xff1a;歪歪IT技术网 首发&#xff1a;迷你兔 来51cto记录一下我们net人最不喜欢记的路由器和交换机的密码恢复问题&#xff0c;虽然很简单的几个步骤&#xff0c;但是我却总是记不住&#xff0c;应该不是记不住&#xff0c;就觉得用处不大&#xff0c;但工作中…

投影转换_即插即用,办公投影不用愁:毕亚兹Mini DP转HDMIVGA转换器

日常办公的时候一些办公小件也很有用的&#xff0c;就比如说HDMI&#xff0c;VGA的转接头&#xff0c;不起眼但是很实用。去客户那里汇报工作&#xff0c;笔记本没有VGA接口&#xff0c;结果会很尴尬&#xff0c;到处借&#xff0c;没有转接头就是接不了&#xff0c;所以索性还…

事件绑定在IE下this是window的问题

昨天写一个函数的时候&#xff0c;后来用了事件绑定&#xff0c;开始没在IE下测试&#xff0c;在chrome下都是没问题的。后来在IE下测试发现出错。 后来修改一下&#xff0c;发现oBox.οnclickfunction(){}没问题&#xff0c;而addEven(oBox, "click", function(){})…

nvidia-jetson系列硬件平台上安装Qt

nvidia-jetson系列硬件平台上安装Qt 目标平台: Jetson Nano、Jetson TX2、etson Xavier NX、Jetson AGX Xavier 概述: 系统环境: 我的设备是下列环境&#xff0c;其实只要是L4T版本的应该都是可以的 镜像烧录方式&#xff1a;SDKManager 系统镜像版本&#xff1a;L4T-32.…

以后在这里安家

以后在这里安家&#xff0c;希望在这里学到更多的知识&#xff0c;分享更多的快乐与汗水&#xff0c;希望大家共同成长转载于:https://blog.51cto.com/heyangfan88/804542

如何用git命令行上传本地代码到github

如何用git命令行上传本地代码到github 2016年09月19日 16:10:36 阅读数&#xff1a;9337注意&#xff1a;安装的前提条件是配置好git的相关环境或者安装好git.exe&#xff0c;此处不再重点提及 上传的步骤&#xff1a;(本文采用git 命令界面进行操作) &#xff08; git config …

C# 的快捷键汇总(一)

全局快捷键 ——〉下列快捷组合键可用于集成开发环境 (IDE) 中的不同位置 命令名 快捷键 说明 关系图.属性 Alt Enter 将焦点从关系图切换到“属性”窗口。 编辑.复制 Ctrl C 将选定项复制到剪贴板。 编辑.剪切 Ctrl X 从…

git修改远程仓库地址

原文连接: https://blog.csdn.net/u012852597/article/details/79241548 内容&#xff1a; 方法有三种&#xff1a; 1.修改命令 git remote set-url origin [url] 例如: git remote set-url origin gitlabgitlab.chumob.com:php/hasoffer.git2.先删后加 git remote rm or…

ftp主动和被动模式_【扫盲】FTP基础知识详解

关注我&#xff0c;你的眼睛会怀孕本文主要介绍FTP的工作原理&#xff0c;FTP主动与被动两种工作模式。FTP 简介FTP协议就是文件传输控制协议。它可以使文件通过网络从一台主机传送到同一网络的另一台主机上&#xff0c;而不受计算机类型和操作系统类型的限制。服务器、大型机&…

单页面与多页面的区别及优缺点

单页面应用&#xff08;SPA&#xff09;&#xff0c;通俗一点说就是指只有一个主页面的应用&#xff0c;浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候&#xff0c;还是会分开写&#xff08;页面片段&#xff09;&…

git使用手册

git使用手册 由 赵庆鹏创建, 最后修改于十二月 14, 2018 一、文件比较 1. 新建两个文件hello/world&#xff0c;内容可自定义&#xff0c;两个文件的内容&#xff0c;需要不相同&#xff0c;进行文件比对。2. 使用diff -u hello world > diff.txt&#xff0c;进行文件比…

python 乒乓球_python乒乓球

这是我用python编的一个小游戏&#xff0c;需要下载simpleaudio库&#xff0c;喜欢的可以玩。 以下是源代码&#xff1a; import turtle as t import simpleaudio as sa yeahsa.WaveObject.from_wave_file(‘bounce.wav’) #创建背景 game t.Screen() game.title(‘双人乒乓球…

《深入浅出Windows Phone 8应用开发》

章节 第1章 概述第2章 开发环境第3章XAML简介第4章 常用控件第5章 布局管理第6章 数据存储第7章 图形动画第8章 多媒体 第9章 启动器与选择器 第10章 手机感应编程第11章 MVVM模式第12章 Silverlight Toolkit组件第13章 网络编程第14章 异步编程与并行编程第15章 联系人和日程安…

CentOS7.4到Elasticsearch一路坑(五)

来来&#xff0c;zookeeper我们聊聊 zookeeper我是搭建了一个集群的&#xff0c;但是搭建完发现&#xff0c;bin/zkServer.sh status一直是不正常的 看了一下日志&#xff0c;的确有问题&#xff08;有问题你还起来了&#xff1f;&#xff09; 从这篇文章参考了一下&#xff1a…

轻量级git服务器 Gogs git 服务器搭建

gogs搭建教程&#xff1a; 原文链接: https://garthwaite.org/docker-gogs.html 内容: Dockerized Gogs git server and alpine postgres in 20 minutes or less // under docker I’ve babysat gitlab omnibus before and it wasn’t any fun. So when a group of volunteer…

akaze特征匹配怎么去掉不合适的点_SIFT特征点

SIFT特征点图像特征点检测一直是研究的热点&#xff0c;从早期的harris角点检测开始&#xff0c;一直有很多人关注图像特征点的检测。最早人们关注图像中的角点&#xff0c;主要是因为角点能够代表图像中的一些特征。比如&#xff0c;通过检测两幅图像中的角点&#xff0c;可以…

fopen 中 按文本读写与按二进制读写 实例

参考&#xff1a;http://blog.csdn.net/hinyunsin/article/details/6401854 #include <stdio.h>int main(int argc, char *argv[]) {char he[20] "hello world\n";FILE *outfile fopen("t.txt", "wt");fwrite(he, sizeof(char), 20, out…