안전한 형 변환 - java
Object object = "name";
int index = (int) object;
System.out.println("index " + index);
-> java.lang.ClassCastException 발생
- instanceof 추가하여 안전하게 처리
Object object = "name";
int index = 0;
if( object instanceof Integer) { // object 값이 Integer인지 확인하고 맞으면 변환하므로 안전한 방법임!!
index = (int) object;
}
System.out.println("index " + index);
코틀린 안전한 형변환 시도하기
val a : Any? = "ABC"
val b : Int? = a as Int
-> ClassCastException 발생
val a : Any? = "ABC"
val b : Int? = a as? Int ?: 0
// 디컴파일 해보면 자바에서 instanceof 로 실행됨을 알 수 있음
when을 사용하여 안전한 처리
val a : Any? = "ABC"
when (a) {
is Int -> println(a)
is String -> println(a)
else -> println("nothing")
}
List에서 null 아이템을 제외하기
-> java
List<String> itemList = new ArrayList<>();
itemList.add("A");
itemList.add(null);
itemList.add("B");
for (String text : itemList) {
if (text != null) {
Log.d("TAG", "Text : " + text);
}
}
-> kotlin
val listVithNulls : List<String?> = listOf("A", null, "B")
for (item in listWithNulls) {
if (item != null) {
println ("Text : $item")
}
}
-> kotlin 람다식 스트림
val listWithNulls : List<String?> = listOf("A", null, "B")
listWithNulls.filter { it != null } .forEach {
println("Text : $it")
}
filterNotNull 이용하기
list의 filterNotNull
val listWithNulls : List<String?> = listOf ("A", null, "B")
// listWithNulls.filter { it != null }.forEach {
// println("Text : $it")
// }
// null filter
val itemList : List<String> = listWithNulls.filterNotNull() // null을 허용하는 list에서 null을 허용하지 않는 list로 바꿔줌
itemList.forEach {
println("Text : $it")
}
block을 이용한 null 예외처리
kotlin 라이브러리
- 코틀린에는 유용한 standard(run, let, apply 등)을 제공한다.
- 한 번에 많은 처리를 할 수 있다.
kotlin 라이브러리를 이용한 null 예외처리
data class Sample(val name : String, val age : Int, val id : String)
fun test() {
val sample : Sample? = Sample("User name", 20, "userId")
tvName.text = sample?.name ?: ""
tvAge.text = sample?.age ?: 0
tvId.text = sample?.id ?: ""
}
-> let 사용
data class Sample(val name : String, val age : Int, val id : String)
fun test() {
val sample : Sample? = Sample("User name", 20, "userId")
// tvName.text = sample?.name ?: ""
// tvAge.text = sample?.age ?: 0
// tvId.text = sample?.id ?: ""
sample?.let { // sample 안의 값들을 한꺼번에 수정할 수 있다.
tvName.text = it.name
tvAge.text = it.age
tvId.text = it.id
} ?: println("sample is null!!!")
}
-> 엘비스 활용
data class Sample(val name : String, val age : Int, val id : String)
fun test() {
val sample : Sample? = Sample("User name", 20, "userId")
sample?.let {
tvName.text = it.name
tvAge.text = it.age
tvId.text = it.id
} ?: let {
println("sample is null!!!")
tvName.visibility = View.GONE
tvAge.visibility = View.GONE
tvId.visibility = View.GONE
}
}
List에서 let으로 null을 제외하기 - kotlin
val listWithNulls : List<String?> = listOf("A", null, "B")
for (item in listWithNulls) {
item?.let { println(it) } // prints A and ignores null
}
// or
listWithNulls.forEach { it?.let { println(it) } }
1개 이상의 null 체크
kotlin 라이브러리 이용한 null 예외처리
val a : String? = "ABC"
a?.let { println(it.length) }
a?.run { println(this.length) }
a?.apply { println(this.length) }
// ...
val a : String? = "ABC"
val b : String? = "BBB"
if (a != null && b != null) {
println ("$a $b")
}
->safeLet 라이브러리 사용
fun test() {
val a : String? = "ABC"
val b : String? = "BBB"
safeLet(a, b) { a, b ->
println("$a $b")
}
}
fun <T1 : Any, T2 : Any, R : Any> safeLet(p1 : T1?, p2 : T2?, block : (T1, T2) -> R?) : R? {
return if (p1 != null && p2 != null) block(p1, p2) else null
}
fun <T1 : Any, T2 : Any, T3 : Any, R : Any> safeLet(p1 : T1?, p2 : T2?, p3 : T3?, block : (T1, T2, T3) -> R?) : R? {
return if (p1 != null && p2 != null && p3 != null) block(p1, p2, p3) else null
}
Multiple variable let in Kotlin
-> unwrap 라이브러리 사용
val _a = foo("Hello")
val _b = foo("World")
val _c = foo(null)
// example : error handing
unwrap(_a, _b, _c) { a, b, c ->
println("$a, $b$c") // not invoked
} otherwise {
println("Nah!") // invoked because '_c' is null
}
kotlin-unwrap - importre 제작
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] Class initializer (0) | 2019.07.12 |
---|---|
[Kotlin] Class Inheritance (0) | 2019.07.11 |
[Kotlin] Null 예외처리 (0) | 2019.07.11 |
[Kotlin] Null 처리 방법 (0) | 2019.07.11 |
[Kotlin] return and jumps and This-expressions (0) | 2019.07.11 |