2017-10-30 1 views
-1

Dies ist mein Code:Trans Int Option [Int]

package net.claritysales.api.helper 

import net.claritysales.api.models.UserEntity 

import scala.util.Random 


trait TestData { 


     def userInfo(
      id : Long = randomLong(), 
      username : String = randomString(), 
      password : String = randomString() 
    ) : UserEntity = { 
     var user : UserEntity = new UserEntity(
      id = id, //Error is Long and recived Optional[Long] 
      username = username, 
      password = password) 
     return user} 

    def randomString(): String = Random.alphanumeric.take(10).mkString("") 

    def randomLong(): Long = Random.nextLong() 
} 

und UserEntity:

case class UserEntity(id: Option[Long] = None, username: String, password: String) { 
    require(!username.isEmpty, "username.empty") 
} 

und die Fehlermeldung: Typenkonflikt, erwartet: Option [Long], aktuell: Long

Wie transformiere ich optional [Long] zu Long? Id ist Optiona [Long] randomLong() und id muss lang sein. Vielen Dank!

+2

Das hängt sehr davon ab, was Sie tun möchten, wenn Ihre Option "None" ist. PS: In dem Code, den Sie uns gezeigt haben, gibt es nichts, was den Typ 'Option [Int]' hat. Hast du vielleicht den falschen Code gepostet? Bitte posten Sie auch die genaue Fehlermeldung. – sepp2k

+0

Danke! und wenn es eine Option in der UserEntity gibt, habe ich es schon gesehen ... –

+0

Ich bearbeite die Frage, um die genannten Details zu klären, danke! –

Antwort

2

Ich bin nicht sicher, wo genau das Problem in Ihrem Code ist, aber ich werde die üblichen Wege decken zu Deal mit Option. Option löst das gleiche Problem, das Java null löst, aber es ist in einer Weise, die um Größenordnungen besser, sicherer und einfacher ist, mit zu arbeiten. Also werde ich hier mit einer hypothetischen Funktion arbeiten, die gerade eine Option[A] erhalten hat. Die Frage, die Sie sich stellen müssen, lautet: Was bedeutet es, wenn ich eine None bekomme? Scala zwingt Sie, diese Frage zu stellen, wo alle implizit nullbaren Klassenarten (wie in Java) nicht gemacht werden.

Option 1: Die Fehler Propagieren Ruhig

Vielleicht None zeigt einen Fehler an der Stelle, wo wir die A von bekam. Etwas ist schiefgelaufen, der Zufallsgenerator ist gescheitert, vielleicht haben wir ihn durch Null geteilt. Dann wollen wir anzeigen, dass wir versagt haben. In diesem Fall ändern wir den Rückgabetyp unserer Funktion von A in Option[A] und geben eine None zurück.

In Java würde dies so aussehen.

if (arg == null) 
    return null; 
return doSomething(arg); 

In Scala,

arg map { x => doSomething(x) } 

Wenn arg ist None, gibt diese None. Wenn arg einen Wert enthält, wird doSomething für den Wert ausgeführt und das Ergebnis wird in einem Option[A] zurückgegeben.

Option 2: None zeigt ein anderes Verhalten

Vielleicht None gibt an, in gewissem Sinne, dass wir die Funktion wollen sich anders verhalten. In Java würde das ungefähr so ​​aussehen.

if (arg != null) { 
    return doSomething(arg); 
} else { 
    return doSomethingElse(); 
} 

In Scala machen wir das auf eine typsichere Weise.

arg match { 
    case None => doSomethingElse() 
    case Some(x) => doSomething(x) // Note that x is A, not Option[A] 
} 

Option 3: None ist nur ein Standard

Manchmal None zeigt nur, dass wir einen Standardwert verwenden möchten. Wenn wir eine Reihe von Zahlen addieren, und einige von ihnen könnten None sein, wollen wir None mit dem numerischen Wert 0 gleichsetzen, so dass es unsere Ergebnisse nicht ändert.

In Java, könnten wir schreiben,

int x = 0; 
if (arg != null) 
    x = arg; 
return doSomething(x); 

In Scala, können wir dies prägnanter mit getOrElse tun.

doSomething(arg.getOrElse(0)) 

Option 4: Propagieren der Fehler Loudly

Vielleicht ist None wirklich schlecht in unserem Fall. Vielleicht ist es ein Fehler im aufgerufenen Code, für den wir überhaupt nicht gerüstet sind. Vielleicht ist unsere Funktion nur waaaay zu wichtig, und wenn es fehlschlägt, dann ist alles andere verfallen. Dann können wir eine Ausnahme machen. Beachten Sie, dass dieser Ansatz in Scala nicht sehr idiomatisch ist, also sollte er sehr sparsam verwendet werden, nur wenn es keinen Sinn macht, etwas davon zu tun.

In Java

if (arg == null) 
    throw new RuntimeException("Oops!"); 
return doSomething(arg); 

In Scala,

arg match { 
    case None => sys.error("Oops!") 
    case x => doSomething(x) 
} 
+0

Danke! Ich habe es noch mehr verstanden! Ich beginne mit der Sprache! –

0

Nutzung erhalten oder aber ich nicht in Ihrem Fall weiß, was in keinem Fall geben

var user : UserEntity = new UserEntity(
     id = id.getOrElse(0l) 
     username = username, 
     password = password) 
    return user} 
1

Das Problem ist nicht, dass Sie eine Option[Int] haben und benötigen eine Int (wie Sie in den Titel und Körper beansprucht haben Ihre Frage). Es ist, dass Sie eine Int haben und eine Option[Int] benötigen. Dies liegt daran, userInfo dauert eine Int, aber UserEntity dauert eine Option[Int]. Um dieses Problem zu lösen, können Sie einfach Some(id) als Argument übergeben.

Verwandte Themen