2017-02-16 31 views
2

我感到困惑与阶模式匹配行为,参见下面的代码:模式匹配java.lang.Long中

import java.util.concurrent.atomic.AtomicLong 

object LongPatternMatching { 

    def main(args: Array[String]): Unit = { 
    useJavaLong 
    useScalaLong 
    useComplexJavaLong 
    } 

    def useScalaLong: Unit = { 
    val aLong: Long = Long.MaxValue 
    aLong match { 
     case v if v == Long.MinValue => println("min") 
     case v if v == Long.MaxValue => println("max") 
    } 
    } 

    def useJavaLong: Unit = { 
    val aLong: java.lang.Long = java.lang.Long.MAX_VALUE 
    aLong match { 
     case v if v == java.lang.Long.MIN_VALUE => println("min") 
     case v if v == java.lang.Long.MAX_VALUE => println("max") 
    } 

    } 

    def useComplexJavaLong: Unit = { 
    val counter: AtomicLong = new AtomicLong(0) 
    counter.incrementAndGet() match { 
     case count if count % 1000 == 0 => println(count) 
    } 
    } 
} 

首先两个功能是好的,但第三(useComplexJavaLong)抛出scala.MatchError:1(的class java.lang.Long)

回答

3

useComplexJavaLong只匹配一个情况,其中modolu操作的剩余部分为0.如果余数不等于0,会发生什么情况?你得到MatchError,因为没有任何情况可以处理。在你的例子中,1 % 1000等于1,而不是0,因此模式匹配爆发。由于该方法useCompleJavaLong匹配模式是不完整的

def useComplexJavaLong: Unit = { 
    val counter: AtomicLong = new AtomicLong(0) 
    counter.incrementAndGet() match { 
    case count if count % 1000 == 0 => println(count) 
    case count => println(s"Remainder equals: ${count % 1000}") 
    } 
} 
1

:你需要一个额外的案例。您可以将其更改为

def useComplexJavaLong: Unit = { 
    val counter: AtomicLong = new AtomicLong(0) 
    counter.incrementAndGet() match { 
     case count if count % 1000 == 0 => println(count) 
     case other => println(other) 
    } 
    }