Tôi không thể tìm ra những gì ?:làm trong trường hợp này ví dụ
val list = mutableList ?: mutableListOf()
và tại sao nó có thể được sửa đổi thành điều này
val list = if (mutableList != null) mutableList else mutableListOf()
Tôi không thể tìm ra những gì ?:làm trong trường hợp này ví dụ
val list = mutableList ?: mutableListOf()
và tại sao nó có thể được sửa đổi thành điều này
val list = if (mutableList != null) mutableList else mutableListOf()
Câu trả lời:
TL; DR: Nếu không phải là tham chiếu đối tượng kết quả [toán hạng đầu tiên] null, nó sẽ được trả về. Nếu không, giá trị của toán hạng thứ hai (có thể là null) được trả về
Các nhà điều hành Elvis là một phần của nhiều ngôn ngữ lập trình, ví dụ như Kotlin mà còn Groovy hoặc C #. Tôi thấy định nghĩa Wikipedia khá chính xác:
Trong một số ngôn ngữ lập trình máy tính, toán tử Elvis
?:là toán tử nhị phân trả về toán hạng đầu tiên nếu toán hạng đó làtrue, và nếu không thì sẽ đánh giá và trả về toán hạng thứ hai của nó. Đây là một biến thể của các nhà điều hành có điều kiện ternary ,? :được tìm thấy ở những ngôn ngữ (và nhiều người khác): các nhà điều hành Elvis là nhà điều hành ternary với toán hạng thứ hai của nó bỏ qua .
Điều sau đặc biệt đúng với Kotlin:
Một số ngôn ngữ lập trình máy tính có ngữ nghĩa khác nhau cho toán tử này. Thay vì toán hạng đầu tiên phải dẫn đến một boolean, nó phải dẫn đến một tham chiếu đối tượng . Nếu không phải là tham chiếu đối tượng kết quả
null, nó sẽ được trả về. Nếu không, giá trị của toán hạng thứ hai (có thể lànull) được trả về.
Một ví dụ:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operatorcó thể được giảm thêm thành một cái gì đó khác. đẹp! Và lời giải thích tốt đẹp, cảm ơn bạn!
Các Elvis điều hành được đại diện bởi một dấu chấm hỏi sau bằng dấu hai chấm: ?:và nó có thể được sử dụng với cú pháp sau:
first operand ?: second operand
Nó cho phép bạn viết mã khuyết điểm và hoạt động như sau:
Nếu first operand không phải null , thì nó sẽ được trả về. Nếu nó là null , thì second operandsẽ được trả về. Điều này có thể được sử dụng để đảm bảo rằng một biểu thức sẽ không trả về giá trị null, vì bạn sẽ cung cấp một giá trị không thể null nếu giá trị được cung cấp là null.
Ví dụ (trong Kotlin):
fun retrieveString(): String { //Notice that this type isn't nullable
val nullableVariable: String? = getPotentialNull() //This variable may be null
return nullableVariable ?: "Secondary Not-Null String"
}
Trong trường hợp này, nếu giá trị đã tính của getPotentialNullkhông phải là null, nó sẽ được trả về bởi retrieveString; Nếu nó là null, biểu thức thứ hai "Secondary Not-Null String"sẽ được trả về thay thế.
Cũng lưu ý rằng biểu thức phía bên phải chỉ được đánh giá nếu phía bên trái là rỗng .
Trong Kotlin, bạn có thể sử dụng bất kỳ biểu thức nào second operand, chẳng hạn như throw Exceptionbiểu thức
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
Cái tên Elvis Operator bắt nguồn từ ca sĩ nổi tiếng người Mỹ Elvis Presley . Kiểu tóc của anh ấy giống Dấu chấm hỏi
Nguồn: Wojda, I. Moskala, M. Phát triển Android với Kotlin. 2017. Packt Publishing
Đây được gọi là toán tử Elvis và nó thực hiện ... Chính xác những gì bạn đã mô tả trong câu hỏi của mình. Nếu phía bên trái của nó là một nullgiá trị, nó sẽ trả về phía bên phải thay vào đó, giống như một dự phòng. Nếu không, nó chỉ trả về giá trị ở phía bên trái.
a ?: bchỉ là viết tắt của if (a != null) a else b.
Một số ví dụ khác với các loại:
val x: String? = "foo"
val y: String = x ?: "bar" // "foo", because x was non-null
val a: String? = null
val b: String = a ?: "bar" // "bar", because a was null
a != null ? a : b
Chúng ta hãy nhìn vào độ lệch :
Khi chúng ta có một tham chiếu nullable r, chúng ta có thể nói "nếu r không null, hãy sử dụng nó, nếu không hãy sử dụng một số giá trị không null x":
Các ?:(Elvis) điều hành tránh rườm rà và làm cho mã của bạn thực sự súc tích.
Ví dụ: rất nhiều hàm mở rộng bộ sưu tập trả về nulldưới dạng dự phòng.
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:cung cấp cho bạn cách xử lý trường hợp dự phòng một cách nhanh chóng ngay cả khi bạn có nhiều lớp dự phòng. Nếu vậy, bạn có thể đơn giản chuỗi nhân các toán tử Elvis, như sau:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
Nếu bạn cũng diễn đạt tương tự với nếu khác thì sẽ có nhiều mã khó đọc hơn.
Đơn giản chúng tôi có thể nói rằng, bạn có hai tay. Bạn muốn biết, bây giờ tay trái của bạn có đang hoạt động không? Nếu tay trái không hoạt động, return emptykhácbusy
Ví dụ cho Java:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
Ví dụ cho Kotlin:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
Toán tử elvis trong Kotlin được sử dụng cho an toàn rỗng.
x = a ?: b
Trong đoạn mã trên, xsẽ được gán giá trị anếu a không nullvà bnếu alà null.
Dưới đây là mã kotlin tương đương mà không sử dụng toán tử elvis:
x = if(a == null) b else a