Scala入门【运算符和流程控制】

news2024/9/20 20:34:29

运算符 

        在 Scala 中其实是没有运算符的,所有运算符都是方法。我们只是省去了 .方法名() 中的点  .   和括号 () 
  1. 调用对象的方法时,点 . 可以省略
  2. 如果函数参数只有一个,或者没有参数,括号()可以省略。
//num1 + num2
num1.+(num2)
    val n1 = 12
    val n2 = 12
 
    //正常写法
    println(n1 + n2)
    println(n1 * n2)
    //标准过程
    println(n1.+(n2))
    println(n1.*(n2))

    //Scala中用对象来调用方法时 点 . 可以省略
    println(7.5 toInt toString())
    //如果函数参数只有一个或者没有,括号()可以省略
    println((7.5.toInt) toString)

流程控制

这里只说和Java中稍微不同的地方

1、if 语句

        Scala和Java的 if 语句的基本用法是一致的,包括如果一个分支的逻辑代码只有一行,可以省去大括号{} ,与Java不同之处在于,Scala的 if - else 语句是可以有返回值的,具体取决于哪个分支满足条件。

案例1

import scala.io.StdIn

object Test02 {
  def main(args: Array[String]): Unit = {

    //输入成绩
    val score: Int = StdIn.readInt()

    //定义结果
    val res:String = if (score < 0 || score > 100){
      "输入错误"
    }else if (score > 0 && score < 60){
      "挂科了,等着重修吧"
    }else{
      "及格了"
    }

    println(res)

  }
}

案例2

如果Scala的返回值类型不一致,我们可以取它们的公共祖先类型。

    //输入成绩
    val score: Int = StdIn.readInt()

    //定义结果
    val res: Any = if (score < 0 || score > 100){
     -1
    }else if (score > 0 && score < 60){
      "挂科了,等着重修吧"
    }else{
      true
    }

    println(res)

案例3-三元运算符

Java中的三元运算符可以用Scala中的 if else 实现

val result: Any = if (score>60) true else  "挂科重修"
println(result)

2、For 循环结构

案例1-包含边界的范围遍历

    //遍历10次  
    //1.范围遍历 to是一个方法的调用,是1这个整型对象调用to方法传入参数10
    for (i <- 1 to 10){
      println(i + "hello scala")
    }
    //完整代码: (我们用上面的写法就好)
    for (i <- 1.to(10)){
      println(i + "hello scala")
    }

案例2-不包含边界的范围遍历

    //遍历9次
    //2.遍历 [1,10) Range默认步长=1,也就是一个一个取
    for (i <- Range(1,10)){
      println(i + "hello scala")
    }
    //效果和上面一样,只不过new Range的话需要指定步长
    for (i <- new Range(1,10,1)){
      println(i + "hello scala")
    }
    //同样 [1,10)
    for (i <- 1 until 10){
      println(i + "hello scala")
    }

案例3-集合遍历

    for (i <- Array(1,5,8)){
      println(i)
    }
    for (i <- List(1,5,8)){
      println(i)
    }
    for (i <- Set(1,5,8)){
      println(i)
    }
    for (i <- Map(("a",1),("b",2),(5,3))){
      println(i)
    }

循环守卫

案例-输出1-10,不输出5

如果用 Java:

for (int i=1;i<=10;i++){
    if(i==5){
        continue;
    }else{
        System.out.println(i);
    } 
}

但是如果用Scala只需要2行:

    //循环守卫
    for (i <- 1 to 10 if i!=5){
      print(i+" ")
    }

 循环步长

输出1、3、5 、7 、9

    //循环步长
    for (i <- 1 to 10 by 2){
      print(i + " ")
    }
    //效果一样 推荐上面的写法
    for (i <- new Range(1,10,2)){
      print(i + " ")
    }

逆序输出10-1

    //设置步长为 -1
    for (i <- 10 to 1 by -1){
      print(i + " ")
    }
    //直接翻转输出
    for (i <- 1 to 10 reverse){
      print(i + " ")
    }

步长为 0.5

前提:步长数据类型为浮点数,范围也必须是小数范围

for (i <- 1.0 to 10.0 by 0.5){
      print(i + " ")
    }

二维数组打印

1,2,3
1,2,3
1,2,3
通常写法 
    for (i <- 1 to 3){
      for (j <- 1 to 3) {
        print(s"第${i}行的内容: " + j + " ")
      }
      println()
    }
精简写法
for (i <- 1 to 3; j <- 1 to 3){
      println(s"第${i}行的内容: " + j + " ")
    }

99乘法表

有手就行

for (i <- 1 to 9){
    for (j <- 1 to i) {
        print(s"${j} * ${i} = ${i * j}  ")
    }
    println()
}

精简写法

for (i <- 1 to 9;  j<- 1 to 9){
    print(s"${j} * ${i} = ${i * j}  ")
        if (j==i) println()
}

引入变量

引入一个变量,这个变量和 i 的值有关。

for (i <- 1 to 10;j = 10 - i){
    println(s"i=${i},j=${j} ")
}

通常的写法

for {
    i <- 1 to 10
    j = 10 - i
}
{
      println(s"i=${i},j=${j} ")
}

九层妖塔

需求:传入参数 n ,输出 n 层妖塔

def main(args: Array[String]): Unit = {
    print_town(10)
  }

  def print_town(floor: Int): Unit ={
    for {
      i <- 1 to floor
      j = 2 * i - 1   //当前行 * 的个数
      l = floor * 2 - 1 //最后一行的 * 的个数
      k = (l - j) / 2 //当前行空格的个数
    }{
      print(" "*k)
      println("*"*j)
    }
  }

输出结果: 

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

循环返回值

循环的返回值是将每次循环的结果保存到一个集合当中的,最后一起返回

案例-返回1-10的平方

//返回一个集合
    val res: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i
    print(res)

运行结果:

Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

可以看到,代码十分简洁,这也说明了Scala对于处理大数据的方便性。

While 循环

        和 Java 的用法一模一样,但Scala并不推荐使用 While 循环。因为我们如果希望通过while循环得到某个结果,就需要在循环外部定义一个变量(类似于全局变量),在循环内部进行相关的处理,如果在大数据处理的场景下,我们往往是并行处理,这样如果我们每个机器执行的代码块操作的是同一个变量,显然结果是不正确的。所以一般更加推荐的是 for 循环这种可以有返回值的循环。

案例-输出1-10

var a = 1
    while (a <= 10){
      println(a)
      a += 1
    }

循环中断

        Scala并没有 continue 和 break,是为了更好地实现函数式编程,推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala 中使用breakable 控制结构来实现 break 和 continue 功能。

案例-输出0-4 [在2处中]

Breaks.breakable(
      for (i <- 0 until 5) {
        if (i == 3)
          Breaks.break()
        println(i)
      }
    )

原理:Breaks.breakable()的原理其实是通过 try-catch 抛出异常来终止循环。

 我们自己也可以实现:

try {
      for (i <- 0 until 5) {
        if (i == 3)
          Breaks.break()
        println(i)
      }
    }catch{
      case e: Exception => RuntimeException
    } 
}

最简写法

我们可以直接导入整个Breaks类的所有方法,直接通过方法名来实现,简化代码

//下划线 _ 相当于Java的 *
import scala.util.control.Breaks._


breakable(
      for (i <- 0 until 5) {
        if (i == 3)
          break()
        println(i)
      }
    )

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

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

相关文章

Unity解决:GIS(GPS的经纬度坐标)定位系统坐标转unity坐标(世界坐标)

目录 一、前言 二、功能实现 三、测试 四、备注 如果要实现该效果的demo&#xff0c;请联系作者 一、前言 最近项目中用到了第三方的定位系统&#xff0c;有的是使用GPS定位、有的是使用UWB定位。第三方的定位系统把他们的定位信息通过网络发送给Unity&#xff0c;在Unity…

项目集活动—项目集定义阶段活动

项目集活动是为支持项目集而开展的任务和工作&#xff0c;贯穿整个项目集生命周期。 项目集活动包括&#xff1a; 项目集定义阶段活动 项目集交付阶段活动项目集收尾阶段活动 鉴于项目集的范围和复杂性&#xff0c;在整个项目集生命周期中&#xff0c;将执行许多项目集支持活…

走向CV的通用人工智能:从GPT和大型语言模型中汲取的经验教训 (上)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…

交织技术详解

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 交织技术1.突发错误…

Linux系统:ulimit命令

目录 一、理论 1.ulimit命令 二、实验 1.打开的最大文件描述符的数量为65535 一、理论 1.ulimit命令 &#xff08;1&#xff09;概念 ulimit是一个计算机命令&#xff0c;用于shell启动进程所占用的资源&#xff0c;可用于修改系统资源限制&#xff0c;限制每个用户可使用…

资源有限的大型语言模型的全参数微调

文章目录 摘要1、简介2、相关工作3、方法3.1、重新思考optimizer的功能3.1.1、使用SGD3.1.2、隐式BatchSize 3.2、LOMO:低内存优化3.3、使用LOMO稳定训练3.3.1、梯度归一化和裁剪的替代方法3.3.2、缓解精度下降 4、实验4.1、内存配置4.2、吞吐量4.3、下游性能4.3.1、主要结果4.…

复杂的HANASQL 多行并入一行

点击蓝字 关注我们 一 前言 基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减去应用服务器的负担,让程序性能更好一些. SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE) 报表类的数据分析程序尤其适用. 动态报表强化了…

PromptBench:大型语言模型的对抗性基准测试

PromptBench是微软研究人员设计的一个用于测量大型语言模型(llm)对对抗性提示鲁棒性的基准测试。这个的工具是理解LLM的重要一步&#xff0c;随着这些模型在各种应用中越来越普遍&#xff0c;这个主题也变得越来越重要。 研究及其方法论 PromptBench采用多种对抗性文本攻击&am…

阿里云服务器的存储容量和性能如何?是否支持多种存储类型?

阿里云服务器的存储容量和性能如何&#xff1f;是否支持多种存储类型&#xff1f;   本文由阿里云代理商[聚搜云]撰写   阿里云服务器作为业界领先的云计算服务提供商&#xff0c;其存储容量和性能一直受到广泛关注。本文将为您介绍阿里云服务器的存储容量、性能以及支持的…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 12 Large-Scale Machine Learning

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 12 Large-Scale Machine Learning Algorithms called “machine learning” not only summarize our data; they are perceived as learning a model or classifier from the data, and thus dis…

Spring Boot 如何使用 @RequestParam 进行数据校验

Spring Boot 如何使用 RequestParam 进行数据校验 在 Web 应用程序中&#xff0c;用户提交的数据通常以请求参数的形式传递。在 Spring Boot 中&#xff0c;可以使用 RequestParam 注解来获取请求参数。但是&#xff0c;如何确保这些请求参数的有效性呢&#xff1f;在本文中&a…

Webots介绍

Webots介绍 1 介绍1.1 概述1.2 应用1.3 入门要求1.4 技术支持1.5 仿真步骤世界&#xff08;webots定义&#xff09;控制器超级控制器 1.6 平台能力三维建模能力物理引擎外设支持 2 软件使用启动webots用户界面文件菜单编辑菜单查看菜单模拟菜单构建菜单叠加菜单工具菜单帮助菜单…

ROS:文件系统以及命令

目录 一、ROS文件系统二、package.xml三、CMakelists.txt四、ROS文件系统命令4.1增4.2删4.3查4.4改4.5roscode4.6rosrun4.7roslaunch 一、ROS文件系统 ROS文件系统级指的是在硬盘上ROS源代码的组织形式&#xff0c;其结构大致如下图所示&#xff1a; WorkSpace --- 自定义的…

在DailyMart中是如何支持多种登录方式的?

欢迎回来&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 1. 理解DDD中的领域模型职责 在我们开始今天的主题之前&#xff0c;让我们先回答一些读者的疑问。 在上一篇文章 [[DailyMart05&#xff1a;通过用户注册呈现一个完整的DDD开发流程]] 发布以后&#xf…

团体程序设计天梯赛-练习集L1篇①

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

SpringBoot多线程异步任务:ThreadPoolTaskExecutor + CompletableFuture

SpringBoot多线程异步任务 需求 在 SpringBoot 项目中&#xff0c;一个任务比较复杂&#xff0c;执行时间比较长&#xff0c;需要采用 多线程异步 的方式执行&#xff0c;从而缩短任务执行时间。 多线程异步 将任务拆分成多个独立的子任务&#xff0c;每个子任务在独立子线…

Linux基础服务2——NFS

文章目录 一、基本了解二、NFS工作机制2.1 示例 三、NFS配置文件3.1 指定客户端3.2 指定权限3.2.1 访问权限3.2.2 用户映射选项3.2.3 其他选项 四、测试案例4.1 安装nfs服务4.2 客户端查看nfs共享策略4.3 客户端挂载nfs共享目录4.3.1 手动挂载4.3.2 自动挂载4.3.3 exportfs重新…

字符数据的表示

目录 1、 英文字符与字符串的表示 2、中文字符 1、 英文字符与字符串的表示 英文字符&#xff1a;用ASCII码&#xff08;128个字符&#xff09;表示 每个英文字符的ASCII码为一个字节&#xff0c;其中低7位有效&#xff0c;最高位为0&#xff0c;该位可用于别的目的&#x…

云原生下一代-服务治理

服务治理 在这里插入图片描述 目录 什么是服务治理如何防止外部突发流量冲垮服务 限制请求的QPS和并发请求数按照调用方进行限流通过中间件访问限流和提前通知下线节点 如何处理服务超时和限流的问题 设置超时时间并对错误进行分类处理启用服务限流控制请求的流量 如何处理服…

【kubernetes】部署网络组件Calico与CoreDNS

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机配置开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…