前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin实战【四】迭代事物:while和for

Kotlin实战【四】迭代事物:while和for

作者头像
先知先觉
发布2019-01-21 15:29:17
1.1K0
发布2019-01-21 15:29:17
举报

1、while循环

kotlin的whiledo-while与Java语法一致,这里简单看一下

代码语言:javascript
复制
while (condition) { //当条件为真时,代码体执行
    /*...*/
}
do {//无条件的执行一次,之后当条件为真时执行
    /*...*/
} while (condition)

2、for循环

for循环仅以一种形式存在,和java的for-each循环一致

Java

代码语言:javascript
复制
int[] data={1,2,3,4,5,6,7,8,9,10};

for(int i:data){
  system.out,println("i");
}

Kotlin

代码语言:javascript
复制
for(i in 10){
  print(i)
}

3、数字迭代:区间和数列

kotlin中没有java的常规循环,所以kotlin使用了区间的概念

区间本质:两个值之间的间隔。这两个值通常是数字:一个是起始值,一个是结束值。使用 ..来表示

例:

代码语言:javascript
复制
val oneToTen = 1..10

注意:kotlin区间是闭合的,意味着第二个值始终是区间的一部分 如果你能迭代区间中所有的值,这样的区间叫做数列

举个例子使用不带参数的when实现FizzBuzz: 规则:用fizz单词替代任何可以被三整除的数字,用buzz单词替代任何可以被五整除的数字。如果一个数字同时是三和五的乘数,我们叫“FizzBuzz”。

代码语言:javascript
复制
fun fizzBuzz(i: Int) = when {
    i % 15 == 0 -> "FizzBuzz " //i可以被15整除,返回FizzBuzz。就像在Java中,%是模操作
    i % 3 == 0 -> "Fizz " //i可以被5整除,返回Buzz
    i % 5 == 0 -> "Buzz " //i可以被3整除,返回Fizz
    else -> "$i " //Else返回这个数字本身
}
for (i in 1..100) { //迭代整数范围1..100
    print(fizzBuzz(i))
}
//1 2 Fizz 4 Buzz Fizz 7 ...

4、迭代map

我们提到过,最常见的情形是,for…in循环是迭代一个集合。这个是和Java是一样的,所以下面我们看看怎么迭代一个map。

举个例子:打印字符的二进制表示

代码语言:javascript
复制
val binaryReps = TreeMap<Char, String>()//用TreeMap,所以键是排序的

for (c in 'A'..'F') { //用字符的范围迭代从A到F的字符
    val binary = Integer.toBinaryString(c.toInt()) //ASCII编码转换到二进制
    binaryReps[c] = binary//在map中用c键存储值
}
for ((letter, binary) in binaryReps) { //迭代一个map,把键值对赋值到两个变量
    println("$letter = $binary")
}

从上面代码可以看出来..语法创建范围不仅仅对数字适用,也对字符适用。

上面的代码使用了一个小技巧,使用键来访问和更新map的简明语法,可以使用map[key]来读取值,并使用map[key]=value设置他,不需要getset。 如下代码: binaryReps[c] = binary 等价于java: binaryReps。put(c,binary)

5、使用in检查集合和区间的成员

使用in运算符来检查一个值是否在区间中,或者它的逆运算!in来检查这个值是否不在这个区间中。

代码语言:javascript
复制
fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
println(isLetter('q')) //true
println(isNotDigit('x')) //true

其实 c in 'a'..'z'等价于a <= c && c <= z

in和!in操作子也可以在when表达式里面使用

代码语言:javascript
复制
fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's a digit!"
    in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    else -> "I don't know…"
}
println(recognize('8')) //It's a digit!

in的使用范围不只局限于字符串。如果你有任何支持比较实例的类(实现了java.lang.Comparable),就可以对这个类的实例进行比较。 如:

代码语言:javascript
复制
println("Kotlin" in "Java".."Scala") //和“Java” <= “Kotlin” && “Kotlin” <= “Scala”一样
//true

字符串在这里是按字母比较的,因为那是String类是这样实现Comparable接口的。

in同样适用于集合

println(“Kotlin” in setOf(“Java”, “Scala”,“hello”)) //这个集没有“Kotlin”字符串 //false

kotlin不包含在集合里面。

总结

  • 1、for 、while和do-while循环与java相似,但是for循环现在更加方便,特别是迭代map的时候。
  • 2、用简洁的语法1..5表示区间。
  • 3、可以使用in和!in运算符来检查某个值是否属于某个区间。
  • 3、..包含起始值和结束值。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、while循环
  • 2、for循环
  • 3、数字迭代:区间和数列
  • 4、迭代map
  • 5、使用in检查集合和区间的成员
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档