zrzeczenie się: części tych odpowiedzi są uogólnieniami innych znalezionych tutaj odpowiedzi.
Użyj lambdas bez określania ich typów argumentów
Można przesłać coś takiego: a=>a.size
zamiast (a:String)=>a.size
.
Użyj symboli ascii jako identyfikatorów.
Należą do nich !%&/?+*~'-^<>|
. Ponieważ nie są literami, są rozdzielane osobno, gdy są obok liter.
Przykłady:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Użyj zestawu zamiast zawiera
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Jest to możliwe, ponieważ Set[A] extends (A => Boolean)
.
Użyj funkcji curry, gdy potrzebujesz dwóch argumentów.
(a,b)=>... //wrong
a=>b=>... //right
_
Jeśli to możliwe, użyj opcji -syntax
Zasady tego są nieco niejasne, musisz czasem trochę zagrać, aby znaleźć najkrótszą drogę.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Użyj częściowej aplikacji
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Użyj ""+
zamiasttoString
a=>a.toString //wrong
a=>a+"" //right
Użyj ciągów jako sekwencji
""
jest czasem najkrótszym sposobem na stworzenie pustej sekwencji, jeśli nie obchodzi cię typ aktula
Użyj BigInt do konwersji liczb na i z ciągów
Najkrótszym sposobem konwersji liczby na ciąg znaków w bazie innej niż baza 10 jest toString(base: Int)
metoda BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Jeśli chcesz przekonwertować ciąg na liczbę, użyj BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Pamiętaj, że to zwraca BigInt, który jest użyteczny jak większość razy, ale nie może być na przykład używany jako indeks sekwencji.
Użyj Seq, aby utworzyć sekwencje
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Użyj ciągów znaków dla sekwencji znaków:
Seq('a','z') //wrong
"az" //right
Skorzystaj ze Stream do nieskończonych sekwencji
Niektóre wyzwania wymagają n-tego elementu nieskończonej sekwencji. Stream jest idealnym kandydatem do tego. Pamiętaj Stream[A] extends (Int => A)
, że strumień jest funkcją od indeksu do elementu o tym indeksie.
Stream.iterate(start)(x=>calculateNextElement(x))
Używaj operatorów symbolicznych zamiast ich nieporadnych odpowiedników
:\
i :/
zamiast foldRight
ifoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Użyj &
i |
zamiast &&
i||
Działają tak samo dla booleanów, ale zawsze będą oceniać oba operandy
Alias długa metoda jako funkcje
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Zna funkcje w standardowej bibliotece
Dotyczy to zwłaszcza metod gromadzenia.
Bardzo przydatne metody to:
map
flatMap
filter
:/ and :\ (folds)
scanLeft and scanRight
sliding
grouped (only for iterators)
inits
headOption
drop and take
collect
find
zip
zipWithIndex3
distinct and/or toSet
startsWith
#define
na przykład również C ++ , ale przyznaję, że to miłedef
ival
są krótsze.