2016-08-25 2 views
2

Мне нужно создать коллекцию объектов из некоторых коллекций примитивных типов. Так что я попытался следующие два метода и оба работают:Использование заархивированных коллекций для инициализации класса case в scala

case class Gr (x:Int,y:Int, z:Int) 

val x = List(1,2,4,2,5) 
val y = Array(1,2,7,4,5) 
val z = Seq(1,2,4,8,5) 


(x,y,z).zipped.toList.map(a => Gr(a._1,a._2,a._3)) 
(x,y,z).zipped.map(Gr:(Int,Int,Int) => Gr) 

Итак, какой из них лучше, и как второй на самом деле работает? И есть ли лучший способ?

ответ

6

1-й может быть уменьшен до (x,y,z).zipped.toList.map(Gr.tupled), а второй может быть уменьшен до (x,y,z).zipped.map(Gr), что кажется короче/яснее для меня.


Напомним, что аргумент map() является, по существу, A => B, поэтому вместо того, чтобы писать ds.map(d => Math.sqrt(d)), который является тип Double => Double, мы можем просто написать ds.map(Math.sqrt) потому sqrt() правильный тип.

В этом случае конструктор Gr имеет тип (A,A,A) => B. Компилятор Scala может принимать выходные данные zipped и сопоставлять тип конструктора, поэтому конструктор может использоваться как аргумент map().

+0

Извините, но никто из них не работает! – KarateKid

+0

Оба проходят все мои тесты (IDE и REPL). [Scala 2.11.8] – jwvh

+0

Да, оба работают, я изменил определение Gr в моем коде. Не заметил этого. Но как же работает вторая работа? Какое неявное преобразование сделано Scala здесь? – KarateKid

Смежные вопросы