Jestem nowy w Scali i próbuję wymyślić najlepszy sposób filtrowania & mapować kolekcję. Oto zabawny przykład wyjaśniający mój problem.Scala: Najlepszy sposób filtrowania i mapowania w jednej iteracji
Podejście 1: Jest to bardzo źle, ponieważ I iteracji poprzez listę dwa razy i obliczania tej samej wartości w każdej iteracji.
val N = 5
val nums = 0 until 10
val sqNumsLargerThanN = nums filter { x: Int => (x * x) > N } map { x: Int => (x * x).toString }
Podejście 2: Jest to nieco lepiej, ale nadal trzeba obliczyć (x * x)
dwukrotnie.
val N = 5
val nums = 0 until 10
val sqNumsLargerThanN = nums collect { case x: Int if (x * x) > N => (x * x).toString }
Tak, jest to możliwe do obliczenia tego bez iteracja kolekcji dwa razy i uniknąć powtarzania tych samych obliczeń?
Dlaczego ktoś dół głosowania tę odpowiedź? 'collect' to bardzo idiomatyczny sposób na zrobienie tego. –
Czy to nie jest dokładnie to samo co moje "podejście 2"? –
Tak, to jest to samo, co podejście nr 2 powyżej i idąc przez definicję _collect_, ten wydaje mi się całkowicie uzasadniony; dokładnie mówi, co robi. Nie znaczy to, że inne podejścia wyjaśnione powyżej są lepsze lub gorsze. – Nirmalya