2017-02-16 3 views
2

Ich bin verwirrt mit scala Muster Verhalten übereinstimmt, siehe Code unten:Mustervergleich 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) 
    } 
    } 
} 

Die ersten beiden Funktionen sind in Ordnung, aber der dritte (useComplexJavaLong) wirft scala.MatchError: 1 (von Klasse java.lang.Long)

Antwort

3

useComplexJavaLong passt nur auf einen einzelnen Fall, in dem der Rest der Modolu-Operation 0 ist. Was passiert, wenn der Rest nicht gleich 0 ist? Sie erhalten eine MatchError, da es keinen Fall gibt, der das handhabt. In Ihrem Beispiel ist 1 % 1000 gleich 1, nicht 0, und somit explodiert die Musterübereinstimmung. Sie werden einen zusätzlichen Fall benötigen:

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

Da das Muster in dem Verfahren passende useCompleJavaLong nicht abgeschlossen ist. Sie können es in

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