Geben Sie das Ende zurück, wenn die Liste nicht leer ist oder eine leere Liste zurückgibt

8

Aus der Liste der E-Mails muss ich 2 Werte erhalten:

  • Option des Kopfs der Liste
  • Liste der anderen von ihnen

Was ist der idiomatische Weg, dies in Scala zu kodieren? Bisher habe ich:

%Vor%

BEARBEITEN: Warum gibt es Any : Wir verwenden GSON für die json-Serialisierung und konvertieren alle Sammlungen intern in Java-Sammlungen und übergeben sie an jsonSerializationContext.serialize , die java.lang.Object als Argument haben, so passt Any uns gut.

    
Zotov 18.06.2013, 15:12
quelle

5 Antworten

15

Ich würde wahrscheinlich nur drop das erste Element (wenn Sie sicher sind, dass das erste Element immer die primäre E-Mail ist). Wie so:

%Vor%

Dies ergibt keine Ausnahme, wenn die primäre E-Mail nicht in der Liste enthalten ist (die Liste ist leer).

    
Jens Egholm 18.06.2013, 15:20
quelle
8

Erlernen Sie einen scalaz . All dies ist in einem Anruf verfügbar:

%Vor%

Demonstration:

%Vor%

Wenn nicht leer

%Vor%

falls leer:

%Vor%

Wie funktioniert das?

Der <^> -Aufruf lautet: Wenn diese Liste leer ist, geben Sie die Null für den Typ zurück, der durch die Rückgabetyp-Funktion definiert ist. Wenn die Liste nicht leer ist, wenden Sie die Funktion darauf an

Der Wert nel ist ein NonEmptyList , den ich sicher head und tail aufrufen kann, ohne befürchten zu müssen, dass eine Ausnahme ausgelöst wird. Meine Funktion gibt (Option[A], List[A])

zurück

Natürlich ist die Null dafür nur (None, Nil) für jede A

    
oxbow_lakes 18.06.2013 16:29
quelle
1

Karte [Zeichenfolge, Beliebige]? Sie könnten auch einfach PHP schreiben ...; -)

Hier ist ein anderer Weg:

%Vor%

Wirklich - ich mag den ganzen Ansatz nicht - ich würde so etwas tun:

%Vor%     
Reuben 18.06.2013 18:16
quelle
0

Ich schlage vor

%Vor%

Damit bleibt die erste E-Mail in einem List nicht einem Option , aber ein Map[String, Product] wird dir sowieso nicht viel nützen, oder?

    
Rex Kerr 18.06.2013 17:25
quelle
0

Für Sequenzen können Sie eine Musteranpassung vornehmen, um den Kopf und den Rest als

zu erhalten %Vor%

Wenn Sie Scala List s verwenden, ist es noch schöner:

%Vor%

Siehe auch Wie kann man Match-Sequence-Comprehensions idiomatisch gestalten? und Scala-Muster, das zu anderen Sequenzen als Listen passt .

Genau wie Reuben würde ich Sie davon abhalten, Map[String,Any] oder ähnliche Konstruktionen zu verwenden. Du wirfst alles weg, was Scala's System dir gibt. Es ist einfach, Fehler zu bekommen, die schwer zu verfolgen sind. Stellen Sie es vielleicht als eine andere Frage - beschreiben Sie, warum Sie Map[String,Any] jetzt benutzen und fragen Sie, wie es verbessert werden könnte.

    
Petr Pudlák 18.06.2013 18:58
quelle

Tags und Links