từ chối trách nhiệm: các phần của câu trả lời này là khái quát của các câu trả lời khác được tìm thấy ở đây.
Sử dụng lambdas mà không chỉ định loại đối số của họ
Nó được phép gửi một cái gì đó như thế này: a=>a.size
thay vì (a:String)=>a.size
.
Sử dụng ký hiệu ascii làm định danh.
Chúng bao gồm !%&/?+*~'-^<>|
. Bởi vì chúng không phải là chữ cái, chúng được phân tách tách biệt khi chúng nằm cạnh các chữ cái.
Ví dụ:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Sử dụng Set thay vì chứa
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Điều này là có thể bởi vì Set[A] extends (A => Boolean)
.
Sử dụng hàm curried khi bạn cần hai đối số.
(a,b)=>... //wrong
a=>b=>... //right
Sử dụng _
-syntax khi có thể
Các quy tắc cho điều này là hơi mơ hồ, đôi khi bạn phải chơi một chút xung quanh để tìm ra con đường ngắn nhất.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Sử dụng một phần ứng dụng
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Sử dụng ""+
thay vìtoString
a=>a.toString //wrong
a=>a+"" //right
Sử dụng chuỗi làm chuỗi
""
đôi khi là cách ngắn nhất để tạo một chuỗi trống nếu bạn không quan tâm đến loại Actula
Sử dụng BigInt để chuyển đổi số đến và từ chuỗi
Cách ngắn nhất để chuyển đổi một số thành một chuỗi trong một cơ sở khác với cơ sở 10 là thông qua toString(base: Int)
phương thức của BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Nếu bạn muốn chuyển đổi một chuỗi thành một số, hãy sử dụng BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Xin lưu ý rằng điều này trả về một BigInt, có thể sử dụng như một số lượng hầu hết thời gian, nhưng không thể được sử dụng làm chỉ mục cho một chuỗi, ví dụ.
Sử dụng Seq để tạo chuỗi
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Sử dụng Chuỗi cho Seqences of chars:
Seq('a','z') //wrong
"az" //right
Sử dụng Stream cho chuỗi vô hạn
Một số thách thức yêu cầu yếu tố thứ n của một chuỗi vô hạn. Stream là ứng cử viên hoàn hảo cho việc này. Hãy nhớ rằng Stream[A] extends (Int => A)
, đó là một luồng là một hàm từ một chỉ mục đến thành phần tại chỉ mục đó.
Stream.iterate(start)(x=>calculateNextElement(x))
Sử dụng các toán tử tượng trưng thay vì các đối tác dài dòng của họ
:\
và :/
thay vì foldRight
vàfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Sử dụng &
và |
thay vì &&
và||
Chúng hoạt động giống nhau đối với booleans, nhưng sẽ luôn đánh giá cả hai toán hạng
Bí danh phương thức dài như hàm
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Biết các chức năng trong thư viện tiêu chuẩn
Điều này đặc biệt áp dụng cho các phương pháp của bộ sưu tập.
Các phương pháp rất hữu ích là:
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
, nhưng tôi thừa nhận nó rất haydef
vàval
ngắn hơn.