Scala编程基础1:基本数据类型、变量、if、for、IO

news2024/11/16 11:42:57

注意:Scala系列的文章需要一定的java基础

Scala底层是用java语言编写的,scala是运行在Java虚拟机(JVM)上的编程语言,它兼容Java,可以直接调用Java的库和框架,并与Java代码无缝集成和互操作。

如果java没有基础的,可以看看在下java专栏的文章^_^,链接如下:

http://t.csdnimg.cn/FkJlt

一、HelloWorld

    /**
     * def:定义函数或者方法的关键字
     * main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
     * args:参数名
     * Array[String]:参数的数据类型
     * Unit:返回值类型 相当于java中的void
     *
     * scala:def main(args: Array[String]): Unit = {}
     * 等价于
     * java:public static void main(String[] args)
     */
object HelloWorld {
  def main(args: Array[String]): Unit = {
    //在scalaz中也可以使用Java语法输出hello world
    System.out.println("hello world")

    //使用scala自己的语法输出hello world
    println("hello world")
  }
}

 注意:

1、scala代码中可以使用Java的类和方法
 2、scala代码中一行语句的结束不需要加分号
 3、class是一个普通的类,不能直接编译运行,object相当于一个单例对象,object类中的方法相当于加上一个static关键字,意味着object类中的方法可以直接调用

参数理解:

def:定义函数或者方法的关键字
main:函数名 main函数是被jvm(java虚拟机)所特有识别的程序入口
args:参数名
Array[String]:参数的数据类型
Unit:返回值类型 相当于java中的void

二、Scala中基本数据类型:

三、Scala中变量的使用

在scala中,可以使用val或者var来定义变量
定义一个变量: var
定义一个常量: val  常量值无法被改变
定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
scala提供一种自动数据类型推断机制,数据类型可以省略不写

/**
 * scala与java中基本数据类型:
 * scala:                    java:
 * Byte                      byte
 * Short                     short
 * Int                       int
 * Long                      long
 * Float                     float
 * Double                    double
 * Boolean                   boolean
 * Char                      char
 */
object DataTypes {
  def main(args: Array[String]): Unit = {
    /**
     * 定义一个变量: var
     * 定义一个常量: val  常量值无法被改变
     * 定义一个变量或常量的标准语法:var/val 变量名:数据类型 = 值
     * scala提供一种自动数据类型推断机制,数据类型可以省略不写
     */

    var a1: Int = 19
    a1 = 29
    println(a1)
    //获取数据类型
    println(a1.getClass) //int

    val a2: Double = 19.03
    //a2 = 29  报错原因:常量值无法被改变
    println(a2.getClass)


    /**
     * 字符串:String
     * 1.scala中的String与java中的String指的是同一个,java中String类的方法在scala中都可以使用
     * 2、scala和java是互相兼容的
     * */

    //字符串切分:
    val c2: String = "wo,xiang,qu,kan,xu,song,de,yan,chang,hui"
    val strings: Array[String] = c2.split(",")
    println(strings(0)) //wo    注意scala中使用索引取值用(),java中使用的是[],但它们的索引都是从0开始
    println(strings(4), strings(5)) //(xu,song)

    //字符串拼接:
    //方式1:使用+拼接
    val c3: String = strings(0) + "*" + strings(1) + "*" + strings(2)
    println(c3)
    //方式2:使用StringBuffer或StringBuilder加append方法
    val c4: StringBuffer = new StringBuffer()
    c4.append(strings(0))
      .append("*")
      .append(strings(1))
      .append("*")
      .append(strings(2))
    println(c4)
    //方式3:利用scala中的mkString方法
    val c5: String = strings.mkString("*") //底层还是使用StringBuilder拼接字符串
    println(c5) //wo*xiang*qu*kan*xu*song*de*yan*chang*hui
    //方式4:插值表达式
    /**
     * scala中, 可以使用插值表达式来定义字符串, 有效避免大量字符串的拼接
     * 格式:val/var 变量名[:String] = s"${变量/表达式}字符串"(s可以换成f,效果相同)
     */
    val c6 = s"${strings(0)}*${strings(1)}*${strings(2)}"  //wo*xiang*qu   底层还是使用StringBuilder拼接字符串
    println(c6)


  }
}

四、if...else和for循环

import java.util.Scanner

/**
 * 流程控制:顺序结构 选择结构 循环结构
 */
object FlowControl {
  def main(args: Array[String]): Unit = {
    //选择结构之if...else
    val sc: Scanner = new Scanner(System.in)
    println("请输入你的考试成绩:")
    val score: Int = sc.nextInt()
    if (score < 60) { //引用变量、方法等不需要再后面加数据类型
      println("真遗憾你挂科了!哭")
    } else {
      println("恭喜你没有挂科!笑")
    }

    /**
     * 注意:
     * 1、scala语法中没有++或--
     * 2、scala中for循环的格式与java有很大的区别
     * 3、scala中泛型使用的是[],java中使用的是<>
     */


    //创建一个数组
    val arr1: Array[String] = Array("java", "scala", "spark", "flink")
    //使用for循环遍历数组
    for (e <- arr1) {
      println(e)
    }
    //使用while循环
    var i: Int = 0
    while (i < arr1.length) {
      println(arr1(i))
      i += 1
    }

    //scala的for循环中to与unitl的区别
    //to:[]左闭右闭
    for (e <- 1 to 10) {
      println("hello world")   //10个
    }
    println("*"*50)
    //until:[)左闭右开
    for (e <- 1 until 10) {
      println("hello world")   //9个
    }

  }
}

五、if与for

1、if

    /**
     * 在scala中,跟Java不同,条件表达式(if)是有返回值的,所以可以将它赋值给变量
     */
    val sc: Scanner = new Scanner(System.in)
    println("请输入你的考试成绩:")
    val score: Int = sc.nextInt()
    if (score < 60) {  //引用变量、方法等不需要在后面加数据类型
      println("真遗憾你挂科了!哭")
      score
    } else {
      println("恭喜你没有挂科!笑")
    }
    println("你的成绩是:"+score)

注意:在scala中,跟java不同,条件表达式(if)可以有返回值

2、for

/**
     * 注意:
     * 1、scala语法中没有++或--
     * 2、scala中for循环的格式与java有很大的区别
     * 3、scala中泛型使用的是[],java中使用的是<>
     */


    //创建一个数组
    val arr1: Array[String] = Array("java", "scala", "spark", "flink")
    //使用for循环遍历数组
    for (e <- arr1) {
//      println(e)
    }
    //使用while循环
    var i: Int = 0
    while (i < arr1.length) {
//      println(arr1(i))
      i += 1
    }

    //scala的for循环中to与unitl的区别
    //to:[]左闭右闭
    for (e <- 1 to 10) {
//      println("hello world") //10个
    }
    println("*" * 50)
    //until:[)左闭右开
    for (e <- 1 until 10) {
//      println("hello world") //9个
    }

六、IO

java读写文件和scala读文件的方式(scala没有写数据的方式)

import java.io.{BufferedReader, BufferedWriter, FileReader, FileWriter}
import scala.io.{BufferedSource, Source}

/**
 * 读取文件:
 * 1、java方式
 * 2、scala方式
 */
object IO {
  def main(args: Array[String]): Unit = {
    //1、java方式读取,写入数据
    //字符缓冲流读取文件
    val br = new BufferedReader(new FileReader("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi"))
    //字符缓冲流写入新文件(默认是覆盖)
    val bw = new BufferedWriter(new FileWriter("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new"))
    var line: String = br.readLine()
    while (line != null) {
      bw.write(line)
      bw.newLine() //写一个换行符
      line = br.readLine()
      bw.flush()
    }
    //释放资源
    bw.close()
    br.close()

    //2、scala方式读取数据,scala没有写数据的方式
    val reder: BufferedSource = Source.fromFile("D:\\projects\\IdeaProjects\\bigdata29-maven\\scala\\src\\main\\scala\\com\\shujia\\day01\\data\\she_hui_zhu_yi_new")
    val lines: Iterator[String] = reder.getLines()     //获取该文件的所有数据
    for(e<-lines){
      println(e)
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1677347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言习题】6.逆序输出

文章目录 1.描述输入描述&#xff1a;输出描述&#xff1a;示例图&#xff1a; 2.解题思路3.具体代码4.代码讲解 1.描述 输入10个整数&#xff0c;要求按输入时的逆序把这10个数打印出来。逆序输出&#xff0c;就是按照输入相反的顺序打印这10个数。 输入描述&#xff1a; 一…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

【面试必看】MySQL部分

MySQL 1. 基础 1. 什么是关系型数据库&#xff1f; 一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。各种表中&#xff08;比如用户表&#xff09;&#xff0c;表中的每一行就存放着一条…

基于jsp+servlet的网上商城

网上商城系统&#xff08;jspservlethtmlcssjsbootstrap&#xff09; 一、运行项目 在项目的doc文件夹下&#xff0c;有文档&#xff0c;教您怎么启动项目。 二、运行截图 a.项目前端页面 b.后台登录界面 c.后台展示界面 三、用户名和密码 前台的用户名是&#xff1a;mor…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

apk反编译修改教程系列-----利用反编译辅助软件 轻松去除apk强制更新弹窗_2 [十八】

上期解析了去除软件强制更新的几种方式。在反编译apk操作中不管那种操作都要根据编译的软件性质来决定,没有那种方法通用于所有的软件 。例如去除更新弹窗。有的只需要修改版本号就可以了。有的需要好几种方法结合来操作去除。前面也讲了几款推荐的辅助编译工具,今天以其中的…

Selenium 自动化 —— 四种等待(wait)机制

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​ 目录 目录 需要等待的场景 自己实现等待逻辑 Selenium 提供的三种等待机制 隐式等待&#xff08;Implicit Waits&#xff09; 隐式等待的优点 隐式等待的缺点 …

山西省特岗教师报名流程及报名照片处理方法

山西省2024年特岗教师招聘公告已发布&#xff0c;计划招聘特岗教师1800名&#xff0c;这对于有志于教育事业的高校毕业生来说&#xff0c;无疑是一个极好的机会。本文将详细介绍报名流程&#xff0c;并提供报名照片处理的方法&#xff0c;帮助应聘者顺利通过报名环节。 一、报名…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中&#xff0c;“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构&#xff0c;用于组织和管理 USB 数据传输和事件。…

走进Java接口测试之多数据源切换示例

文章目录 一、前言二、demo实现2.1、开发环境2.2、构建项目2.3、配置数据源2.4、编写配置文件2.5、编写Dao层的mapper2.6、编写实体成层2.7、编写测试类2.8、验证结果 三、多数据源 demo 实现3.1、配置数据源3.2、增加pom文件3.3、修改数据源读取方式&#xff1a;3.4、增加动态…

Redis-持久化操作-AOF

持久化操作-AOF AOF是什么&#xff1f; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只允许加文 件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换言之…

UE5C++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

【案例】使用Vue实现标题项元素上下移动

效果图 效果说明 每一组数据只能在对应的二级类目中进行上下移动&#xff0c;当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置&#xff0c;当点击的元素为该组的第一个元素时&#xff0c;将提示已经是第一项了并且不能进行移动&#xff1b;当点击下移图标的时…

03-数据结构(一)

链接&#xff1a;C# 数据结构_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1a541147Nk/?spm_id_from333.337.search-card.all.click&vd_source6eb7d966aa03ff5cb02b63725f651e68 链接&#xff1a;使用 C#.Net 学习掌握数据结构 (更新中)_哔哩哔哩_bilibili 一…

aws s3

列出关键点 创建s3 设置s3策略&#xff0c;所有人访问 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", …

【美团面试2024/05/14】前端面试题滑动窗口

一、题目描述 设有一字符串序列 s&#xff0c;确定该序列中最长的无重复字母的子序列&#xff0c;并返回其长度。 备注 0 < s.length < 5 * 104 s 由英文字母、数字、符号和空格组成 示例1 输入 s "abcabcbb" 输出 3 二、原题链接 这道题在LeetCode上的原题链…

【C语言】4.C语言数组(2)

文章目录 6. 二维数组的创建6.1 ⼆维数组的概念6.2 ⼆维数组的创建 7. 二维数组的初始化7.1 不完全初始化7.2 完全初始化7.3 按照⾏初始化7.4 初始化时省略⾏&#xff0c;但是不能省略列 8. 二维数组的使用8.1 ⼆维数组的下标8.2 ⼆维数组的输⼊和输出 9. 二维数组在内存中的存…

基于 Spring Boot 博客系统开发(九)

基于 Spring Boot 博客系统开发&#xff08;九&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;八&#xff09;&#x1f…

day15 个人博客项目登录验证CookieSession验证码安全

知识点 1.后台验证-登录用户逻辑安全 2.后台验证-cookie和session 3.后台验证-验证码和万能密码 通常的后台验证登录都是&#xff0c;1.发送登录请求&#xff0c;账户密码&#xff1b;2.接受账号密码3.对账号密码进行判断 正确 -》跳转到成功登录界面 失败-》重新登录 而…

C++ | Leetcode C++题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> t;vector<vector<int>> ans;vector<vector<int>> subsetsWithDup(vector<int> &nums) {sort(nums.begin(), nums.end());int n nums.size();for (int mask …