
Int對(duì)象是沒有判斷當(dāng)前數(shù)是不是質(zhì)數(shù)的方法的,所以一般都是直接寫在方法里去判斷,或者抽離成方法去調(diào)用,舉個(gè)例子
原始方式
//1-100內(nèi)的質(zhì)數(shù)
import util.control.Breaks._
object NumberTest {
def printEven() = {
for (i <- 0 to 100) {
breakable {
i match {
case i if i < 1 => break
case 1 | 2 | 3 => print(i + ",")
case i if (canNotExcept(i)) => print(i + ",")
case _ => break
}
}
}
}
def canNotExcept(i: Int): Boolean = {
val half = i / 2
var flag = true
breakable {
for (n <- 2 to half) {
if (0 == i % n) {
flag = false
break
}
}
}
flag
}
}
隱式轉(zhuǎn)換轉(zhuǎn)換方式
如果想讓Int直接帶有判斷質(zhì)數(shù)的能力,基本不太可能
但是如果換一種思路:把Int轉(zhuǎn)換成一個(gè)能判斷自己是不是質(zhì)數(shù)的類型,就好了啊
轉(zhuǎn)換類
implicit class IntUtil(i: Int) {
// 判斷數(shù)字為質(zhì)數(shù)
def isPrime: Boolean = {
i match {
case i if 1 > i => false
case 1 | 2 | 3 => true
case i => {
val half = i / 2
if (except(half)) false else true
}
}
}
// 判斷數(shù)字不是質(zhì)數(shù)
def isNotPrime: Boolean = !isPrime
//尾遞歸,判斷能佛被比divisor小的數(shù)整除
@tailrec
final def except(divisor: Int): Boolean = {
if (2 == divisor ) 0 == i % divisor
else if (0 == i % divisor) true
else except(divisor - 1)
}
}
使用更方便
import util.control.Breaks._
// 引入自定義的隱式轉(zhuǎn)換
import com.zing.my.IntUtil._
object NumberTest {
def printEven() = {
for (i <- 0 to 100) {
breakable {
// i 會(huì)直接隱式轉(zhuǎn)換成IntUtil類型,然后就可以使用isNotPrime方法了
if (i.isNotPrime) {
break
}
print(i + ",")
}
}
}
}
小結(jié)
大佬說,尾遞歸是函數(shù)式編程的精髓之一,而隱式轉(zhuǎn)換是Scala的精髓之一。我玩Scala大約一周了,暫時(shí)的體會(huì)是用起來真爽,看起來真難懂。
本文展示了使用隱式類型,幫助擴(kuò)展原有類的方法,雖然實(shí)質(zhì)上是把原有類型轉(zhuǎn)換成新類型,但是寫起來看著就是方法被擴(kuò)展了。
優(yōu)點(diǎn)是:
- 可以更加方便的對(duì)類型進(jìn)行擴(kuò)充,不限于方法,也可以是屬性,方法參數(shù)等
- 合適情況下可讀性也更強(qiáng),更加專注于邏輯而不是實(shí)現(xiàn)細(xì)節(jié)
缺點(diǎn)是:
- IDEA無法自動(dòng)幫你導(dǎo)入隱式函數(shù)或者類,只能自己手工來
- 不合適的情況下大佬隱藏了細(xì)節(jié),導(dǎo)致初學(xué)者完全不知道為什么直接就調(diào)用到了方法。不知> 道實(shí)現(xiàn)的邏輯
隱式轉(zhuǎn)換的原理其實(shí)就是編譯器發(fā)現(xiàn)編譯不能直接進(jìn)行,再嘗試你導(dǎo)入的隱式轉(zhuǎn)換,轉(zhuǎn)換成功了就編譯成轉(zhuǎn)換后的結(jié)果,不成功,那就真的不成功了。
PS: 這里的break是一個(gè)方法哦,Scala是沒有break和continue的
參考
工具書:《Scala編程 第三版》
喜歡請(qǐng)點(diǎn)個(gè)贊
轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/u/4915ed24d1e3
如有錯(cuò)誤,請(qǐng)務(wù)必指正。謝謝
我的博客:https://xzing.github.io/