Scala(三)之“控制结构”

原创 2016年08月29日 23:15:23
  1. for和foreach循环
    遍历一个集合中的所有元素,对集合中的每个元素进行操作,或者利用现有的集合创建一个新集合。
scala> val a = Array("apple", "banana", "orange")
a: Array[String] = Array(apple, banana, orange)

scala> for(e <- a) println(e)
apple
banana
orange

使用for/yield组合可以从输入的集合中生成一个新的集合。

scala> val newArray = for(e <- a) yield e.toUpperCase
newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

for循环计数器

scala> for(i <- 0 until 10){
     | print(i)
     | }
0123456789

生成器与守卫语句

scala> for(i <- 1 to 3)println(i)
1
2
3

scala> 1 to 3
res47: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)

scala> for(i <- 1 to 3) println(i)
1
2
3

scala> 1 to 3
res49: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)

scala> for(i <- 1 to 10 if i < 4) println(i)
1
2
3

遍历Map集合

scala> val names = Map("fname" -> "Robert",
     | "lname" -> "Goren")
names: scala.collection.immutable.Map[String,String] = Map(fname -> Robert, lname -> Goren)

scala> for((k, v) <- names) println(s"key: $k, value: $v")
key: fname, value: Robert
key: lname, value: Goren

for循环中使用多个计数器

scala> for(i <- 1 to 2; j <- 1 to 2) println(s"i = $i, j = $j")
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
// 对于对个for循环推荐使用大括号的风格
scala> for{
     | i <- 1 to 2
     | j <- 1 to 2
     | }println(s"i = $i, j = $j")
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2

for循环为多维数组赋值

scala> val array = Array.ofDim[Int](2, 2)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> for{
     | i <- 0 to 1
     | j <- 0 to 1
     | }println(s"($i)($j) = ${array(i)(j)}")
(0)(0) = 0
(0)(1) = 0
(1)(0) = 0
(1)(1) = 0

for循环中嵌入if语句,if语句又叫做过滤器

scala> for{
     | i <- 1 to 10
     | if i % 2 == 0
     | }println(i)
2
4
6
8
10

scala> for{
     | i <- 1 to 10
     | if i > 3
     | if i < 6
     | if i % 2 == 0
     | }println(i)
4

创建for表达式(for/yield组合)
在一个已有的集合上,使用带有yield语句的for循环和算法,生成一个新的集合。
除了极个别的情况,for推导不会改变集合的返回类型

scala> val name = Array("chris", "ed", "maurice")
name: Array[String] = Array(chris, ed, maurice)

scala> val capName = for(e <- name) yield e.capitalize
capName: Array[String] = Array(Chris, Ed, Maurice)

Scala中没有break和continue关键字,scala.util.control.Breaks类提供了类似的功能。

case语句中匹配多个条件

scala> val i = 5
i: Int = 5

scala> i match {
     | case 1 | 3 | 5 | 7 | 9 => println("odd")
     | case 2 | 4 | 6 | 8 | 10 => println("even")
     | }
odd

try/catch匹配一个或者多个异常

scala> val s = "foo"
s: String = foo

scala> try{
     | val i = s.toInt
     | }catch{
     | case e:Exception => e.printStackTrace
     | }
java.lang.NumberFormatException: For input string: "foo"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)
    at scala.collection.immutable.StringOps.toInt(StringOps.scala:29)
    at $line124.$read$$iw$$iw$.liftedTree1$1(<console>:14)
    at $line124.$read$$iw$$iw$.<init>(<console>:13)
    at $line124.$read$$iw$$iw$.<clinit>(<console>)
    at $line124.$eval$.$print$lzycompute(<console>:7)
    at $line124.$eval$.$print(<console>:6)
    at $line124.$eval.$print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
    at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
    at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:807)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:681)
    at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:395)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:415)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:923)
	at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
    at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:909)
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74)
    at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
版权声明:本文为博主原创文章,转载请声明出处。

相关文章推荐

Scala(二)之“数值”

Scala中所有的数值都是对象,包括Byte、Char、Double、Float、Int、Long和Shart。与被称为“非数值类型”的Unit和Boolean一样,这些数值类型都继承扩展自AnyVa...

Linux环境变量知识:/root/.bashrc与/etc/profile的异同

要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell。 交互式模式就是shell等待你的输...

Scala详解---------控制结构和函数

条件表达式:            Scala的if else语法结构和Java的一样,不过,Scala的if else表达式有值,这个值就是跟在if或者else后面的表达式的值。        ...

快学Scala第2章--控制结构和函数

快学Scala第二章–控制结构和函数本章要点 if表达式有值。 块也有值—-是它最后一个表达式的值。 Scala的for循环就像是增强版的Java for循环 分号(在绝大多数情况下)不是必须的 vo...

Scala控制结构

package com.heres.scala /** * 1.Scala中基本控制结构,顺序、条件、循环。这和其它的JVM语言是一致的,但是Scala也有些 * 高级的流程控制结构,例如:模...

Scala的内建控制结构

Scala中的内建控制机构仅有if、while、for、try、match和函数调用。虽然Scala的基础控制结构少,但也足以支持指令式语言里所有的实质内容。因为它们都能产生值,有助于缩短代码。 ...
  • xxfigo
  • xxfigo
  • 2016年08月25日 11:22
  • 539

快学Scala(2) 控制结构和函数

1. 条件表达式//普通形势的if-else if(x > 0) 1 else -1//if-else返回类型,是分支类型的公共超类型,如以下表达式的超类型是Any if(x > 0) "string...

Scala学习笔记-控制结构

Scala-控制结构

Scala 中的基本控制结构有顺序、条件和循环三中方式

package com.supeng.spark.scala /** * Scala 中的基本控制结构有顺序、条件和循环三中方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控...

2.scala控制结构

scala总的控制结构跟java有很大的区别,以下是scala特色的控制结构知识点总结: 1.scala中的if表达是有返回值的 2.if条件表达式可以进行类型推导,类型推导的一般过程就是根据变量的值...
  • geeksu
  • geeksu
  • 2017年04月13日 17:19
  • 128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Scala(三)之“控制结构”
举报原因:
原因补充:

(最多只允许输入30个字)