break和continue
2者都表示跳出,只是范围不同而已,scala中用breakable{ }表示范围,用break方法来标识在何处跳出。
如果breakable{ }把整个循环包裹,表示跳出循环,如果只包裹了里面的某次循环,表示跳出当前次循环
import util.control.Breaks._
object BreakDemo {
def main(args: Array[String]) {
breakable {
for (i <- 1 to 10) {
if (i == 2) break() else println(i)
}
}
}
}
import util.control.Breaks._
object ContinueDemo {
def main(args: Array[String]) {
for (i <- 1 to 10) {
breakable {
if (i == 2) break() else println(i)
}
}
}
}
调foreach时使用元组的模式匹配报NotInferedU
, 用case + 给元组中的变量指定类型就可以,实际上这是用的偏函数,scala无法区分入参是元组还是n个参数,所以只能用偏函数的方式来取巧
val tm = parse(jsonStr).extract[TM]
tm.cols.foreach {
case (col: String, arr: Array[String]) => {
println(col + "##" + arr.length)
}
}
//下面一个函数就是入参为元组的情况下的书写方式
val a: Tuple2[Double, Double] => Boolean = {
case (x: Double, y: Double) => {
if (x * x + y * y < 1) true else false
}
}
或者
val a: Tuple2[Double, Double] => Boolean = {
case (x, y) => {
if (x * x + y * y < 1) true else false
}
}
可以直接以匿名的方式传入
val count = rdd1.filter({
case (x, y) =>
if (x * x + y * y < 1) true else false
}).count()
判断指定String中的某字符是半角还是全角
val pattern = Pattern.compile("[^\\x00-\\x80]")
val str1 = "我们"
val str2 = "aaa"
if(pattern.matcher(str1(0)).find()) println("全角")
else println("半角")
判断指定String在指定编码下的长度
val str = "我们aaa"
println(str.getBytes("GBK").length)
会发现汉字在GBK是2,英文和数字是1,如果换成UTF-8,则变成3