Розпакування кортежу в операціях з картою


79

Я часто опиняюсь у роботі зі списками, послідовниками та ітераторами кортежів і хотів би зробити щось на зразок наступного:

val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }

Однак, здається, компілятор ніколи не погоджується з цим синтаксисом. Натомість я закінчую писати,

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}

Що просто безглуздо. Як я можу обійти це?

Відповіді:


137

Навколо потрібно використати case:

arrayOfTuples map {case (e1: Int, e2: String) => e1.toString + e2}

37
І вам навіть не потрібно вводити елементи кортежу. case (e1, e2) => досить добре, типи елементів кортежу відомі.
Дідьє Дюпон,

32

Мені подобається функція кортежу; це і зручно, і не менш важливо, введіть сейф:

import Function.tupled
arrayOfTuples map tupled { (e1, e2) => e1.toString + e2 }

18

Чому б вам не використовувати

arrayOfTuples.map {t => t._1.toString + t._2 }

Якщо вам потрібні параметри кілька разів, або інший порядок, або у вкладеній структурі, де _ не працює,

arrayOfTuples map {case (i, s) => i.toString + s} 

здається короткою, але читабельною формою.


1
Я думаю, головна причина полягає в тому, що в більшості випадків обробка функції map набагато складніша, ніж, _.toString + _і він хоче маніпулювати більш зрозумілими іменами, ніж t._1і t._2.
Ніколас

Ну, тоді arrayOfTuples map {case (i, s) => i.toString + s}, звичайно, зручніше. Однак вам слід задати питання, яке у вас є, щоб отримати відповідь, яка вам потрібна. :)
невідомий користувач

Ну, як він сказав "часто", я сподіваюся, це означає "в різних випадках", я не бачу жодного сценарію, коли вам часто потрібно Int + Stringкартографування. ;)
Ніколас


2

Зверніть увагу, що за допомогою Dotty(foundation of Scala 3) розширення параметрів було розширено, дозволяючи такий синтаксис:

// val tuples = List((1, "Two"), (3, "Four"))
tuples.map(_.toString + _)
// List[String] = List("1Two", "3Four")

де кожен _посилається з метою пов'язаної частини кортежу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.