2017-12-24 105 views
6

Trong Kotlin, tôi muốn thực hiện một nhiệm vụ chỉ khi một biến khác không phải là null (nếu không, không có op). Tôi có thể nghĩ đến hai cách ngắn gọn:Cách tốt hơn để chỉ gán nếu bên phải không phải là rỗng?

fun main(args: Array<String>) { 
    var x: Int? = null 
    var n = 0 

    // ... do something ... 

    x?.let { n = it } // method 1 
    n = x ?: n   // method 2 
} 

Tuy nhiên, họ không cảm thấy đủ gọn gàng, với tần suất tôi phải làm. Phương pháp đầu tiên có vẻ quá mức cần thiết. Phương pháp thứ hai là dai dẳng trong việc yêu cầu một biểu thức sau ?:.

Tôi cho rằng phải có cách nào tốt hơn, chẳng hạn như n =? x? Hoặc n = x?? Lanhung?

+8

Không có cú pháp chuyên dụng để thực hiện hoạt động này trong Kotlin. – yole

Trả lời

0

Có điều sau đây:

val x: Int? = null 
val n: Int = x ?: return 

này biên dịch hoàn toàn tốt đẹp, mặc dù n có thể không được chuyển nhượng. Ngay cả các cuộc gọi sử dụng n sau khi 'gán' của nó được cho phép, ví dụ: println(n), bởi vì trình biên dịch chỉ biết rằng nInt và điều đó là OK. Tuy nhiên, bất kỳ dòng nào theo nhiệm vụ sẽ không bao giờ được gọi, bởi vì chúng tôi return từ phạm vi. Tùy thuộc vào những gì bạn muốn, đó là một no-op. Chúng tôi không thể tiếp tục vì không thể chỉ định n, do đó, chỉ cần quay lại.

Tùy chọn khác là val n: Int = x!! sẽ ném NullPointerException nếu x == null cần được xử lý ở nơi khác. Tôi không khuyên bạn nên thực hành điều này, bởi vì Kotlin cung cấp các phương pháp sạch hơn để xử lý nullability.

+0

Trường hợp sử dụng thực sự của tôi là: Tôi đang viết một hàm bao bọc (trong Kotlin) trên đầu trang của một thư viện Java. Nếu tham số không phải là null, giá trị của nó được gán cho một trường tương ứng trong đối tượng bên dưới. Nếu nó là null, thì không có gì được thực hiện, để lại trường với giá trị mặc định của nó. Có nhiều trường cần đặt, vì vậy việc trả lại ở giữa không phải là một tùy chọn. Cảm ơn bạn đã điều tra và gợi ý. –

+1

Sau đó, tôi đoán phương pháp gốc của bạn 2 là tốt nhất: rõ ràng, ngắn gọn, đơn giản và đạt được những gì bạn muốn. – Erik

1

Hãy thử infix để 'mô phỏng tùy chỉnh trong fi x hoạt động'

// define this 
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this 

/////////////////////////////////////////////////////////// 
// Demo using 

// Now, Kotlin infix-style 
fooA assignFromNotNull fooB 
barA assignFromNotNull barB 
bazA assignFromNotNull bazB 

// Old code, Java if-style 
if (fooB != null) { 
    fooA = fooB; 
} 
if (barB != null) { 
    barA = barB; 
} 
if (bazB != null) { 
    bazA = bazB 
} 
+0

Tôi hiểu những gì bạn đang cố gắng làm với định nghĩa hàm infix. Nhưng 3 dòng mã Kotlin đó là gì? Tôi rõ ràng không biết về siêu dữ liệu của Kotlin đủ tốt. –

+0

Mã demo được sao chép từ dự án của tôi. Tôi sẽ làm sạch nó để làm cho câu trả lời rõ ràng. – Raymond

Các vấn đề liên quan