Scala基础快速学习笔记

2023-11-13

Scala
--------------
    Java语言脚本化
    面向函数:直奔主题
    直接写程序,直接运行即可。
进入Scala shell
-----------------
$>bin/scala
$scala>:help  //查看帮助

o.getClass();

classOf(res6)
inter::类型推断

Int             -->RichInt
Double          -->RichDouble
Char            -->RichChar


scala                  java
-----------------------------
Int                    int+Integer
val(value)           final:常量
var                    可以修改(变量)
var x :String = "hello"
Any(任意)区分大小写     Object
1.toString()//自动1->Integer

1.to(10)      //方法
1.to 10       //操作符

使用函数进行数据类型转换
var a:Int = 100;
var b:Short = 100;
b = (Short)a  //error
b = a.toShort //ok

++ / --       //error,不支持
+=      | -=  //ok

函数  |  方法
----------------------
函数:不需要通过类即可直接调用方法。min power
import scala.math._   "_"类似"*"
sqrt(2)           //开方
pow(n)            //几次方

单例对象
--------------


class Xxxx{
    。。
}
object Xxxx{

}

REPL : read + eval + print + loop


无参的函数使用时可以省略()
----------------------------------
    $scala>1.toString()
    &scala>1,toString

apply
----------------------------------
  1.$scala>"hello"(4)             //String.chatAt(i)
  2.$scala>"hello".apply(4)       //String.chatAt(i)
  3.$scala>BigInt("1234")         //BigInt.apply("1234567")


控制结构 + 函数
---------------------------------
1.条件表达式(if else)有值
2.三元运算符
。。。
val y = if(x>0) 1
val y = if(x>0) 1 else()            //() == 不存在的  (unit === void)
3.进入shell的粘贴模式
$scala>:paste
$scala>                            //CTRL + D
句尾不需要分号,单行中写入多条语句需要用分号隔开
4.打印
  print("hello")
  println("hello")
5.可以使用readLine从控制台读取一行输入
  readLine("xxx")                 //字符串
  readLine("age")                 //Int
6.循环:与c++,java一样的while循环
[while]
var i = 0;
while(i<10){
| i=i+1;
| println(i)
}
[for]
for(i <- 1 to 10){
|  print(i)
|}

for(i <- 1 until 10){println(i)}

Map + reduce
----------------------
map()  :

scala break操作
Scala没有提供break和continue语句来退出循环
可以用breakable块
import scala.util.control.Breaks._

breakable{
    for(i <- 1 to 10){
    if(i<5) println(i) else break;
    }
}


[a.scala]
$scala>load /home/ubuntu/a.scala

高级for循环,打印正三角形9*9表格
----------------------------------
for(i <- 1 to 9;j <- 1 to 9){
    if(i >= j) print(i + "x" + j + "=" + (i + j) + " ")
if(j==i) println()
}

yield(产生)
-----------------------
每次循环期间,每次产生新值放入集合中
 var x = for(i <- 1 to 10) yield i % 3
 x: scala.collection.immutable.IndexedSeq[int] = Vector(1,2,0,1,2,0,1,2,0,1)

函数不需要调用但是方法必须调用

函数,递归函数必须声明返回类型。
----------------
[定义]
def abs(x:Double) = if (x >= 0) x else -x
def fname(pname:ptype) : retype = body
def add(a:Int,b:Int) : Int = a + b

[阶乘函数(循环方式)]
def fac(n:Int) = {
    var r = 1;
    for(i <- 1 to n)r = r * i
    r
    }
[阶乘函数(递归方式)]
def fac(n:Int) : Int = {
    if(n == 1) 1 else fac(n-1)*n
}

fac(6) = 6 * fac(5) ==> 6 * 5 * fac(4)==>..

apply
----------------------
 "xxx"(4)             //"xxx".apply(4)


默认参数值,带名参数
-------------------------

   public String xxx(String a,String b = "xxx"){
    ...
}


$scala>def dec(a:String,left:String = "[",right:String="]") : String = left + a + right
$scala>var x = dec("tom")                                  //x = [tom]           //默认值
$scala>var x =dec(a="tom",right="###")                     //x = [tom]           //指名参数


变长参数
-----------------------
def sum(args:Int*) = {
    var x = 0;
    for(i <- args) r =r + i
    r
}
$scala>var x = sum(1,2,3,4,5);
$scala>var x = sum(1 to 5)                                     //error,类型不匹配
$scala>var x = sum(1 to 5:_*)   加上":_*"转换成参数序列。

1 to n            //Range区间,不是Seq

def rsum(args:Int*):Int = {
if(args.length == 0) 0
else args.head + rsum(args.tail:_*)
}

instanceOf
getClass() == Xxx.class

过程,不返回值的函数,不使用 = 附作用
------------------------------
def box(name:String){
    println("$$$" + name + "$$$")
}


def box(name:String): Unit = {
    println("$$$" + name + "$$$")
}


lazy value:延迟求值
-----------------------
$scala>lazy val x = scala.io.source.FromFile("/xx/x/x/").mkString                 //延迟求值
$scala>x


异常
-------------------
java : Throwable Error() + Exception(RuntimeException)
public void add(...){
    try{

    }
    
    catch(X1Exception e1){
        e1
    }
    catch(X2Exception e2){
    }
}    


checked                    //待检
managed                    //托管

try{
    。。。
}
catch{
    case_ : XxxxException => xxx                                 //进入xxx处理程序
    case ex : XxxxException => ex.printStackTrace()              //进入xxx处理程序 
                                                                     //越具体的异常越靠前  
}

数组 + 缓冲区
---------------------
int[]
ByteBuffer

$scala>val x = new Array[Int](10)    //0.0.0.0.....
$scala>val x = new Array[String](10)null,null,null,....
$scala>var x = Array("hello" + "world")
$scala>x(3)                                       //方法数组元素 

ArrayBuffer                                      //数组缓冲区
$scala> scala.collection.mutable.ArrayBuffer
scala>var x = ArrayBuffer[Int]()
scala>x ++= Array(1,2,3)                        //使用++=操纵任何集合
scala>x.trimEnd(5)                                //移除最右的n个元素
scala>x.insert(2,3,4,5,6)                                          //在2位置插入3.。。
scala>x.remove(2,3)                                                //从2开始移除,移除3个
scala>x.remove(2)                                                  //x.remove(2,1)
scala>buffer.toArray                                               //从buffer到Array之间的转换
scala>array.toBuffer                                               //..

scala>for(i <- buffer | array) .. //遍历buffer|array

//yield遍历过程中,生成新的集合
scala>for(i <- 1 to 5 if i % 2 == 0) yield i * 2                  //先filter,再乘以2产生新集合
scala>var x = Array(1 to 5)

//内置函数
scala>Array(1,2,3).sum

//缓冲区排序
scala>y.sorted(_<_)                                               //升序排序

//快速排序
Scala>var x = Array(1,7,2,9)
scala>scala.util.Sorting.quickSort(a)                            

//mkString
scala>a.mkString("and")

多维数组
----------------
int[层][行][列] cube                                            //java
Array[Array[Array[Int]]]                                        //scala
scala>var x = Array.ofDim[Int](3,3,3)                           //三维数组
scala>var idx = 1;
for(i <- 0 until x.length){
    for(j <- 0 until x(i).length){
        for(k <- 0 until x(i)(j).length){
        x(i)(j)(k) = idx ;
        idx += 1
        }
    }
}


//使用不等长元素的多维数组
scala>var x = new Array[Array[Int]](4)

java和scala的互操作
-------------------------------
。。。。。

map  tuple(映像和元组)
-----------------------
1.java.util.Map
  java.util.HashMap
  java.util.TreeMap
2.var map = Map("001"->"tom","002"->"tomas","003"->"tomasLee")
3.var map = collection.mutable.Map("001"->"tom","002"->"tomas","003"->"tomasLee")
4.map("001")       //get
  map.contais("001")   //判断是否存在
  map.getOrElse("001","nobody")  //组合
  map("001") = "xxx"     //赋值
5.map2 - "004"   //支持


迭代
---------
scala>for((k,v)<-map)println(k + "-----" + v)   //遍历

Java
---------
map.keySet()    //key集合
map.values()    //value集合

排序map
------------
scala>import scala.collection.immutable.SortedMap


实现java和scala之间map的互相转换
scala>var m :scala.collection.mutable.Map[String,String]


tuple(元组)
-----------------------
元组,Map是有两个元素的元组
元组最多支持22元素
TupleX
scala>var t : Tuple3[Int,String,Int] = (1,"tom",12)       //tuple
scala>t._1              //n从1开始
scala>val (id,name,age) = t
scala>id
scala>name
scala>age


zip:咬合操作
--------------------
两个数组的元素一一组合。
scala>var ids = Array("001","002","003")
scala>var names = Array("tom","tomas","tomasLee")
scala>var pairs = ids.zip(names)



-------------
 1.class Classname{
    private var id = 0;    //必须初始化,否者需要声名成abstract
}
2.class Counter{
    private var value = 0
    def increment() = value += 1
    def current() = value
    }
3.getter和 setter

    getter  //age
    setter  //age=
4.Dog           //可以更加丰富的控制可见性
    class Dog{
        private[this] var value = 0
        def addOne() = {age += 1}
        def compare(b:Dog) = {age < b.age}
        }


    class Counter{
    privte var value = 0
    def increment() = value += 1
    def current() = value
    }


5. scala.beans.BeanProperty
    class Dog{
        @BeanProperty private var age = 0    //生成getter  /  setter
    def addOne() = {age += 1}
    def compare(b:Dog)={age < b.age}
}
6.辅助构造函数
    class Dog{
        ...
        def this(name:String){
        this()               //主构造
        this.name = name     //赋值

    如果主构造函数的参数使用了var或val,他们会生成对应的字段。如果没有使用的话,但在方法中进行了访问,自动升级成字段。

7.java构造函数的第一条构造语句
    class Dog{
        public Dog(){
            this.
            }
        }


8.嵌套类(内部类)
    class Car{
        class Engine{
        }
    }

对象Object        
---------------------
   1.定义单例对象
    [Box.scala]
    object Box{
        def getColor = "yellow"
    }


    [Box.class]
    fine class Box{
        public static String getColor();
    }

class Counter{
private var value = 0;
def increment() = value += 1
def current() = value
}
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala基础快速学习笔记 的相关文章

  • [云原生专题-50]:Kubesphere云治理-操作-分步部署基于微服务的业务应用 - 数据库中间件MySQL微服务部署过程

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122927050 目录 前言 第1步
  • Json对象和字符串之间的相互转换

    例子 1 new Function形式 function strToJson str var json new Function return str return json 2 使用全局的JSON对象 JSON stringify obj
  • 大数据时代究竟带来了什么? ——写给普通人看的大数据文章

    数据 让一切有迹可循 让一切有源可溯 我们每天都在产生数据 创造大数据和使用大数据 只是 你 仍然浑然不知 百度知道和知乎问答里一直有小伙伴在问这个问题 比如 大数据时代 生活和思维发生了哪些变 大数据时代给我们的生活带来了哪些好处呢 以及
  • NvidiaCUDA通用计算简介及优化方法概述

    IT168 技术 1 GPU通用计算简介 注 本文为IT168 NVIDIA联合举办的 如何并行化我的应用 方案征集活动参赛作品 本次方案征集活动详情见 http cuda itpub net thread 1299715 1 1 html
  • 字节跳动《算法中文手册》火了,完整版 PDF 开放下载!

    今天给大家推荐两份来自字节跳动大佬的算法进阶指南 据说有不少小伙伴靠这份指南成功掌握了算法的核心技能 拿到了 BAT offer 希望对大家有帮助 第一份资料是 70K Star 的 labuladong 的算法小抄 作者 labulado
  • 【自我提高】树莓派GPIO的几种语言控制方法 python 篇

    使用 python 语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 首先安装 python 和 GPIO 库 具体安装过程参考 https blog csdn net w
  • DETR论文解读

    DETR基本介绍 DETR的一个创新是端到端的目标检测 它能够将目标检测看做成集合预测问题 而不需要像之前的目标检测算法需要anchor或者nms等 总之就是一个将CNN和transformer结合的一个新颖的目标检测框架 改变预测头还可以
  • Android studio 一个项目引入另一个项目作为Libary

    1 在我们开发Android项目时 有时需要一个项目作为另一个项目的工具类的引用 这样就需要配置下 使得MyLibrary到MyApplication作为一个module 我们直接截图上步骤 1 假设我们新建两个项目 一个是引入的项目 一个
  • Error: failed to create deliver client :orderer client failed to connect to orderer

    问题描述 在部署fabric时 peer create channel时报错如下 Error failed to create deliver client orderer client failed to connect to order
  • linux删除某个目录下旧文件只保留最新的10个

    find aaa bbb ccc d name mingcheng sort head n 10 xargs rm rf 指令解析 find aaa bbb ccc d 意思是 在 aaa bbb ccc查找文件夹 name mingche
  • Redis-应用问题解决

    缓存穿透 缓存穿透现象 应用服务器压力变大 redis命中率降低 一直查询数据库 原因 redis查询不到数据库 出现很多非正常url访问 解决方案 1 对空值缓存 如果一个查询返回的数据为空 不管是数据是否不存在 我们仍然把这个空结果 n
  • 【C++设计模式】详解装饰模式

    2023年8月31日 周四上午 这是我目前碰到的最难的设计模式 非常难以理解而且比较灵活多半 学得贼难受 写得贼费劲 2023年8月31日 周四晚上19 48 终于写完了 花了一天的时间来学习装饰模式和写这篇博客 虽然基本上把我今天的收获都
  • 点在多边形内的判断

    c语言代码 typedef struct tagVERTEX double x double y VERTEX 判断点与多边形关系 0 外 1 上 2 内int PointInPolygon VERTEX pt VERTEX vtx int
  • Pgsql报错:PostgreSQL的SQL语句参数上限报错

    org postgresql util PSQLException An I O error occurred while sending to the backend Caused by java io IOException Tried
  • maven 全入门

    使用SPRINGSOURCE TOOL SUITE创建maven web project 推荐使用springsource的sts 一款基于eclipse整合的ide sts下载地址 安装好m2clipse插件后 在ide菜单栏点击 win
  • mssql sqlserver 获取指定日期为本月第几个工作日

    转自 https www cnblogs com lairui1232000 p 9286104 html 摘要 下文讲述工作中 需要获取指定日期在当月的工作日 下文讲述常规的指定工作日所在月的天数分析 实现思路 1 生成一个国家法定假日表
  • C#的笔记属性索引器,委托事件,泛型集合,异常捕捉

    C 有一些与其他语言C Java不同的特性这里特别记一下 他们大部分基本的内容是相同的 C 有属性索引器 委托事件 泛型集合 trycatchfinally异常捕捉 属性Property 属性时一种很像字段的方法 他有getset访问器 使
  • 高并发高可用(二)架构

    4 大型网站架构模式 模式词汇来源于建筑学 定义 每个模式描述一个在我们周围不断重复发生发生的问题及该问题解决方案的核心 这样你就能一次又一次使用该方案而不必做重复的工作 为解决大型网站所遇到的高并发访问 海量数据处理 高可用运行等系列问题
  • MySQL的预读机制

    一 预读机制 InnoDB在I O的优化上有个比较重要的特性为预读 预读请求是一个i o请求 它会异步地在缓冲池中预先回迁多个页面 预计很快就会需要这些页面 这些请求在一个范围内引入所有页面 InnoDB以64个page为一个extent
  • 网上书店管理系统 课程设计

    数据库原理及应用 综合设计报告 第一章 绪论 随着计算机技术的发展以及计算机网络的逐渐普及 因特网成为了人们查找信息的重要场所 二十一世纪是信息的时代 所以信息的交换和信息的流通就显得特别的重要 因此网上书店的出现成为必然 实体书店在正常运

随机推荐

  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import
  • Retrofit2 使用@Multipart上传文件

    1 上传单个文件 1 1定义接口 Multipart POST uploadImgs Call
  • Laravel5.6 实现小程序使用openid登陆、手机号验证码登陆、账户密码登陆三种登陆方式

    我的个人博客 逐步前行STEP 目前开发小程序 按需求要实现3种登陆方式 1 微信授权登陆 2 账户密码登陆 3 手机号 验证码登陆 我使用laravel自带的Auth认证机制 通过attempt方法进行账户验证 但是默认的认证机制必须包含
  • YOLOv6网络结构详解

    网络结构 根据官方代码使用Drawio绘制的YOLOv6 s网络结构图 官方资源 美团技术团队对于YOLOv6的介绍 文章 文章 文章 论文地址 YOLOv6 A Single Stage Object Detection Framewor
  • Java基础——大杂烩

    今天阿Q给大家来一节大杂烩 讲一下专题性不强的java基础知识 main方法详解 public static void main String args 这里面只有args能改变 public 被jvm调用 访问权限足够大 static 被
  • 记一次结构体字节对齐引起的严重问题

    头文件自定义了bool类型 4个字节 ifndef bool define bool int define true 1 define false 0 endif typedef struct bool automaticActivatio
  • 微信小程序消息订阅的实现——后端是nodejs的koa框架

    在做毕设中 我遇到这么一个使用场景 当顾客购买某个商家的商品后 那这个商家应该要收到通知信息 提示你家商品被购买了 故有了以下代码 微信小程序js代码 onSubmit function 用户点击确认支付 用户应该点击允许 同意提醒信息订阅
  • window 7 平台上 MXNET 源码编译

    目的 本文主要描述怎么在windows上编译mxnet源码 得到可用的libmxnet dll和libmxnet lib文件 版本 mxnet x64 release CPU版 运行环境 windows 7 64bit visual stu
  • [风格迁移系列五: WaveCT-AIN] 医学图像的风格迁移和跨域自适应(泛化性)

    不同于自然图像的风格迁移 在临床应用上 医学图像更加注重图像生成的纹理细节 并且需要实时的推理速度 因此提出一个实时且高质量的风格迁移方法非常重要 这篇论文实现了这个方法 Remove Appearance Shift for Ultras
  • Rectangle矩形类

    题目 设计一个名为Rectangle的矩形类 并实现Comparable接口 这个类包括 1 两个名为width和height的double数据域 它们分别表示矩形的宽和高 2 Rectangle的无参构造方法 width和height的默
  • Transactions on Multimedia 投稿经验分享

    关于IEEE Transactions on Multimedia 投稿经验分享 SCI分区 JCR分区 Q1 Q1 影响因子 7 3 期刊官方网站 IEEE Transactions on Multimedia IEEE Xplore 投
  • 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN

    聚类分析 处理无标签数据 from IPython display import Image matplotlib inline 1 使用K Means方法按照相似度对对象进行分组 1 1使用sklearn实现K Means聚类 from
  • rdp协议解读

    转自 http blog csdn net jiangtao killer article details 6940346 一 前言 RDP 远程显示协议 Remote Display Protocol 简称RDP 提供了客户和服务器之间的
  • 微博爬取多页评论

    最近在学习爬虫 爬取了第一页后 信心满满 但是翻不了页 就卡住了 搜了好多资料 b站都翻烂了 还是没找到合适的代码 最后在知乎找到了 2023微博评论爬虫 用python爬上千条微博评论 突破15页限制 知乎 zhihu com 这篇文章干
  • Linux之系统进程及控制

    一 什么是进程 进程就是系统未完成并且正在进行的工作 二 查看系统进程 1 图形方式查看 gnome system monitor 图示 2 进程查看命令 ps A 所有进程 a 在当前环境中运行的进程 不包含环境信息 u 显示进程用户信息
  • Win7下硬盘安装Linux双系统

    参考如下两篇文章 基本能搞清楚如何安装 1 Win7下硬盘安装Linux双系统 Win7下硬盘安装CentOS6 2 http www 3fwork com b902 002405MYM032666 2 Windows7硬盘安装Fedora
  • 【思维导图】python常见的异常(error) 汇总

    点开看大图 python常见的异常 error 汇总 name error o尝试访问一个没有申明的变量 oNameError name xrange is not defined 原因 在Python 3中 range 与xrange 合
  • wchar_t 、UTF-8、UTF-16的转换方法

    继续编码转换 Unicode 有两套编码集 UCS 2 和 UCS 4 Windows 的内部其实是用的 UCS 2 标准 并用 UTF 16 来实现 而非 Windows 系统大多采用了 UTF 8 实现 大家都知道在windows上wc
  • ZBrush怎样自动保存

    在使用 ZBrush执行任何会话期间 您都可以设置将文件自动保存 并可以修改保存时间间隔 文件保存位置等设置 发生系统错误后要重新启动ZBrush 时 可以从临时文件夹或指定的文件夹中恢复备份文件 如果您选择不恢复备份文件 退出应用程序后文
  • Scala基础快速学习笔记

    Scala Java语言脚本化 面向函数 直奔主题 直接写程序 直接运行即可 进入Scala shell gt bin scala scala gt help 查看帮助 o getClass classOf res6 inter 类型推断