[Scala] Scalowcy się nie p*** w tańcu

0

Zaktualizowałem scalę z 2.12 do 2.13 i rozsypał mi się cały projekt.
Pozmieniali metody w najważniejszych klasach kolekcji.

W Map metoda - jest już final i nie można jej napidsać, doszły 2 nowe.
W Seq zniknęła metoda par.

Jak zrobić poniższe w scali 2.13?

mySeq.par.foreach({
    // ...

Trzeba użyć kolekcji współbieżnej z "org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0" ?

0

po co piszesz w tym jezyku? cos zwiazanego z data science?

7
lambdadziara napisał(a):

po co piszesz w tym jezyku? cos zwiazanego z data science?

bo mi się nudzi na chacie

4
Julian_ napisał(a):

Trzeba użyć kolekcji współbieżnej z "org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0" ?

Trzeba

4

W Map metoda - jest już final i nie można jej napidsać, doszły 2 nowe.

Czemu nadpisujesz cokolwiek z Map?

W Seq zniknęła metoda par.

Na https://docs.scala-lang.org/overviews/core/collections-migration-213.html napisano:

Parallel collections are now in a separate hierarchy in a separate module.

Ten separate module to https://github.com/scala/scala-parallel-collections

no wlasnie doczytałem, czyli muszę użyć ParSeq, wkurzyłem się i zamiast googlac napisalem - Julian_ 1 minuta temu

Nie trzeba używać wprost. W readme na githubie jest napisane:

In your code, adding this import:
import scala.collection.parallel.CollectionConverters._
will enable use of the .par method as in earlier Scala versions.

0
Wibowit napisał(a):

W Map metoda - jest już final i nie można jej napidsać, doszły 2 nowe.

Czemu nadpisujesz cokolwiek z Map?

napisuję map, bo brakuje mi metody getOrElse, więc se stworzyłem swoją rozszerzającą standardową implementację

0
Julian_ napisał(a):
Wibowit napisał(a):

W Map metoda - jest już final i nie można jej napidsać, doszły 2 nowe.

Czemu nadpisujesz cokolwiek z Map?

napisuję map, bo brakuje mi metody getOrElse, więc se stworzyłem swoją rozszerzającą standardową implementację

na szybko do tego służy implicit, lub nadpisuj z MapLike

1

Przecież Map ma metodę getOrElse. Poniższy kod działa zarówno w Scali 2.12 jak i 2.13:

val a = Map(1 -> "a", 2 -> "b")
a.getOrElse(3, "z")
0

sorry, chodziło mi o getOr:

  def getOr(key: String, onError: String => Unit): Option[Country] = {
    val value = map.get(key)
    value.getOrElse(onError(key))
    value
  }
3
def getOr(key: String, onError: String => Unit): Option[Country]

Takie cudo to pasuje to funkcyjnych kolekcji jak pięść do oka. Słusznie, że czegoś takiego nie ma w standardowym API. Poza tym czemu key ma typ na sztywno String, a wartość zwracana to Country? Zapomniałeś o generykach?

Wadą dodawania nowej metody w podklasie jest to, że twoja podklasa nie jest obecna w sygnaturach metod z biblioteki standardowej, więc musisz sobie ją czasem konwertować, by mieć tę swoją metodę, np:

val map = List("1", "2", "3").groupBy(identity) // `mapa` jest typu Map z biblioteki standardowej
val myMap = MyMap(map: _*) // konwertujemy z powrotem na podklasę - uwaga to zajmuje sporo czasu bo cała mapa jest budowana od nowa
myMap.getOr("wut", _ => sys.exit(5))

Implicity będą lepiej działać, bo nie wymagają przepakowania kolekcji.

0
Julian_ napisał(a):

metoda -

Świetna nazwa metody :D

0

coś mi intelij nie widzi parallel w import scala.collection.parallel.CollectionConverters._ Nie czaję jak to ma działać, skoro w https://github.com/scala/scala/tree/v2.13.3/src/library/scala/collection nie ma takiego pakietu jak parallel, a jednak sbt jakoś sobie z tym radzi.

0

Jeśli chcesz mieć par to wystarczy tyle:
https://scastie.scala-lang.org/Ll96PsI5SnaXutmdMfIhAw

import scala.collection.parallel.CollectionConverters._

Seq.tabulate(5)(identity).par.foreach(println)

Pakiet parallel jest w https://github.com/scala/scala-parallel-collections/tree/master/core/src/main/scala/scala/collection/parallel

1
Pinek napisał(a):
Julian_ napisał(a):

metoda -

Świetna nazwa metody :D

Polecam Programowanie Funkcyjne dla Śmiertelników ze Scalaz i próbę wypisania wszystkich metod-operatorów z tej biblioteki
Chociaż już są jakieś próby Scalaz cheat sheet

1 użytkowników online, w tym zalogowanych: 0, gości: 1